You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 16:24:00