{"id":15047930,"url":"https://github.com/xwhqsj/calljvm","last_synced_at":"2025-10-13T14:10:44.177Z","repository":{"id":133802963,"uuid":"214635037","full_name":"XWHQSJ/CallJvm","owner":"XWHQSJ","description":"Call JVM from C/C++ in ThreadPool","archived":false,"fork":false,"pushed_at":"2020-06-15T15:14:08.000Z","size":1127,"stargazers_count":15,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-10T01:06:51.375Z","etag":null,"topics":["cplusplus-11","java","jni","multithreading","threadpool"],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/XWHQSJ.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-10-12T11:24:41.000Z","updated_at":"2023-03-28T09:21:56.000Z","dependencies_parsed_at":"2024-07-09T13:02:39.439Z","dependency_job_id":null,"html_url":"https://github.com/XWHQSJ/CallJvm","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XWHQSJ%2FCallJvm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XWHQSJ%2FCallJvm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XWHQSJ%2FCallJvm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/XWHQSJ%2FCallJvm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/XWHQSJ","download_url":"https://codeload.github.com/XWHQSJ/CallJvm/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248137887,"owners_count":21053775,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cplusplus-11","java","jni","multithreading","threadpool"],"created_at":"2024-09-24T21:06:07.856Z","updated_at":"2025-10-13T14:10:44.066Z","avatar_url":"https://github.com/XWHQSJ.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CallJvm\n\nCall JVM from C/C++ in ThreadPool Using JNI\n\n### 文件结构\n\n```text\n.\n├── callJvmThreadpool\n│   ├── a.out\n│   ├── cmake-build-debug\n│   │   ├── callJvm.cbp\n│   │   ├── callJvmThreadp.cbp\n│   │   ├── callJvmThreadpool.cbp\n│   │   ├── CMakeCache.txt\n│   │   ├── CMakeFiles\n│   │   │   ├── 3.14.5\n│   │   │   │   ├── CMakeCCompiler.cmake\n│   │   │   │   ├── CMakeCXXCompiler.cmake\n│   │   │   │   ├── CMakeDetermineCompilerABI_C.bin\n│   │   │   │   ├── CMakeDetermineCompilerABI_CXX.bin\n│   │   │   │   ├── CMakeSystem.cmake\n│   │   │   │   ├── CompilerIdC\n│   │   │   │   │   ├── a.out\n│   │   │   │   │   ├── CMakeCCompilerId.c\n│   │   │   │   │   └── tmp\n│   │   │   │   └── CompilerIdCXX\n│   │   │   │       ├── a.out\n│   │   │   │       ├── CMakeCXXCompilerId.cpp\n│   │   │   │       └── tmp\n│   │   │   ├── clion-environment.txt\n│   │   │   ├── clion-log.txt\n│   │   │   ├── cmake.check_cache\n│   │   │   ├── CMakeDirectoryInformation.cmake\n│   │   │   ├── CMakeOutput.log\n│   │   │   ├── CMakeTmp\n│   │   │   ├── feature_tests.bin\n│   │   │   ├── feature_tests.c\n│   │   │   ├── feature_tests.cxx\n│   │   │   ├── main.dir\n│   │   │   │   ├── build.make\n│   │   │   │   ├── cmake_clean.cmake\n│   │   │   │   ├── CXX.includecache\n│   │   │   │   ├── DependInfo.cmake\n│   │   │   │   ├── depend.internal\n│   │   │   │   ├── depend.make\n│   │   │   │   ├── flags.make\n│   │   │   │   ├── link.txt\n│   │   │   │   ├── progress.make\n│   │   │   │   ├── socketMultithread.cpp.o\n│   │   │   │   ├── socketThreadpool.cpp.o\n│   │   │   │   └── tpool.cpp.o\n│   │   │   ├── Makefile2\n│   │   │   ├── Makefile.cmake\n│   │   │   ├── progress.marks\n│   │   │   └── TargetDirectories.txt\n│   │   ├── cmake_install.cmake\n│   │   ├── hs_err_pid22583.log\n│   │   ├── hs_err_pid22734.log\n│   │   ├── hs_err_pid22793.log\n│   │   ├── hs_err_pid22856.log\n│   │   ├── hs_err_pid22911.log\n│   │   ├── main\n│   │   └── Makefile\n│   ├── CMakeLists.txt\n│   ├── jni.h\n│   ├── jni_md.h\n│   ├── main.cpp\n│   ├── pureMultithread.cpp\n│   ├── qin_test1.jar\n│   ├── qin_test.jar\n│   ├── server\n│   ├── server.cpp\n│   ├── client\n│   ├── client.cpp\n│   ├── socketMultithread.cpp\n│   ├── socketThreadpool.cpp\n│   ├── test.cpp\n│   ├── tpool.cpp\n│   └── tpool.h\n└── README.md\n```\n### 文件解释\n```text\n- CMakeLists.txt : cmake编译文件\n- jni.h : java JNI接口函数\n- jni_md.h : jni.h调用的必要函数\n- main.cpp : 测试主程序\n- pureMultithread.cpp : 纯净的多线程程序\n- qin_test1.jar : 测试的jar包1\n- qin_test.jar : 测试的jar包0\n- server.cpp : socket服务器程序\n- client.cpp : socket客户端程序\n- socketMultithread.cpp : socket服务器+jni调用的多线程程序\n- socketThreadpool.cpp : socket服务器+jni调用的线程池程序\n- test.cpp : 测试程序\n- tpool.cpp : 线程池实现程序\n- tpool.h : 线程池实现头文件\n```\n\n### 程序编译\n\n可根据CMakeLists.txt文件中的\n```shell script\ncd callJvmThreadpool\ncmake ..\n./a.out\n```\n\n### 程序目的\n\n- 最初目的：使用C++代码通过JNI接口调用Java模块代码（实际上是启动一个JVM，在JVM中运行Java模块代码）\n- 中间目的：使用多线程技术由每次调用JNI生成一个JVM，提升为生成多个JVM线程运行Java模块代码\n- 最终目的：使用线程池技术预先生成多个JVM线程，减少多线程调用Java模块代码带来的资源消耗\n\n### 注意事项\n- C++通过JNI接口调用Java模块代码是一种不得已而为之的方法，每次调用JNI启动JVM的开销都很大，并不值得\n- 为了解决JVM “一调一用” 问题，后程序框架调整为使用UNIX Domain Socket方案，在本地进行文件数据映射，大大减小开销\n\n### 相关内容\n\n- https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html\n- https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/jniTOC.html\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxwhqsj%2Fcalljvm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxwhqsj%2Fcalljvm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxwhqsj%2Fcalljvm/lists"}