如何在Windows Visual Studio 2019中用C++ Android原生代码创建Java VM
在Windows Visual Studio 2019环境下通过C++ Android原生代码创建Java VM的问题
我的核心需求是在Windows Visual Studio 2019开发环境下,基于C++编写的Android原生代码创建Java VM,从而调用现有.jar格式Java库中的函数,以下是已尝试的解决方案及遇到的问题:
已尝试的解决方案
- 参照公开教程手动创建Java VM:操作失败,原因是Visual Studio 2019安装路径下找不到所需的dlfcn.h库。
- 引入第三方dlfcn-win32库补充依赖:该库是Android端C++原生代码创建Java VM的必需依赖,参考实现代码如下:
#include <dlfcn.h> #include <jni.h> typedef int (*JNI_CreateJavaVM_t)(void *, void *, void *); typedef jint (*registerNatives_t)(JNIEnv* env, jclass clazz); static int init_jvm(JavaVM **p_vm, JNIEnv **p_env) { JavaVMOption opt[4]; opt[0].optionString = "-Djava.class.path=/data/local/tmp/shim_app.apk"; opt[1].optionString = "-agentlib:jdwp=transport=dt_android_adb,suspend=n,server=y"; opt[2].optionString = "-Djava.library.path=/data/local/tmp"; opt[3].optionString = "-verbose:jni"; // 调试用,生产环境可移除 JavaVMInitArgs args; args.version = JNI_VERSION_1_6; args.options = opt; args.nOptions = 4; args.ignoreUnrecognized = JNI_FALSE; void *libdvm_dso = dlopen("libdvm.so", RTLD_NOW); void *libandroid_runtime_dso = dlopen("libandroid_runtime.so", RTLD_NOW); if (!libdvm_dso || !libandroid_runtime_dso) { return -1; } JNI_CreateJavaVM_t JNI_CreateJavaVM; JNI_CreateJavaVM = (JNI_CreateJavaVM_t) dlsym(libdvm_dso, "JNI_CreateJavaVM"); if (!JNI_CreateJavaVM) { return -2; } registerNatives_t registerNatives; registerNatives = (registerNatives_t) dlsym(libandroid_runtime_dso, "Java_com_android_internal_util_WithFramework_registerNatives"); if (!registerNatives) { return -3; } if (JNI_CreateJavaVM(&(*p_vm), &(*p_env), &args)) { return -4; } if (registerNatives(*p_env, 0)) { return -5; } return 0; }
遇到的编译问题
dlfcn-win32库的dlfcn.c内部依赖*<Windows.h>库,使用Clang 5.0编译C++项目生成Android .so文件时编译失败,报错无法识别Windows.h库。
后续尝试仅引入头文件及该项目通过CMake生成的dlfcn.dll,仍无法解决问题:面向Android编译时Clang不识别__declspec(dllimport)语法,无法正确绑定函数调用启动JVM所需的libdvm.so*,最终无法实现C++侧调用.jar文件内的Java函数。
内容的提问来源于stack exchange,提问作者María Román
相关产品推荐
相关产品推荐

