我有一个Android应用程序,其中包含Java和C++代码.我的C++代码被Bundle 到不同的.so文件中,并且可以从Java或其他.so文件中调用.从一些.so文件中,我需要调用一些Java代码.
要调用Java代码,我认为我们需要JNIEnv.这可以在加载库时调用JNI_onLoad方法时接收,也可以在Java调用C++代码时在方法参数中传递JNIEnv时接收.要调用Java代码,推荐的方法似乎是保存JNIEnv,并在以后调用Java代码时使用它.
但在我的例子中,我想让我的.so文件保持通用,这样它们就可以在不同的操作系统上使用.因此,我不希望跨多个依赖项传递JNIEnv.What I am looking for is to get JNIEnv on demand.
我看到我可以通过使用JNI_GetCreatedJavaVms方法获取JVM,然后使用JVM实例获取JNIEnv来实现这一点.问题是这个方法似乎没有在jni.h中定义,但只提供了类似以下内容的声明:
/*
* VM initialization functions.
*
* Note these are the only symbols exported for JNI by the VM.
*/
jint JNI_GetDefaultJavaVMInitArgs(void*);
jint JNI_CreateJavaVM(JavaVM**, JNIEnv**, void*);
jint JNI_GetCreatedJavaVMs(JavaVM**, jsize, jsize*);
我知道这些文件应该从其他库中加载,但找不到任何有关我需要导入哪些库、需要在C++文件中导入哪些头文件/源文件以及如何使用该方法的文档.有人能帮上忙吗?
我发现了这个GitHub issue,它表明这些方法没有在更早的时候导出,现在只从API级别31导出.但我不清楚应该如何访问这些导出的方法.
我正在使用NDK的r18b来构建我的代码,当我try 使用JNI_GetCreatedJavaVM时,它抛出以下错误:
[x86_64] SharedLibrary : libJniPoc.so
/workplace/alias/workspace/src/JniPoc/src/main/cpp/core/InfoProvider.cpp:16: error: undefined reference to 'JNI_GetCreatedJavaVMs'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [/workplace/alias/workspace/build/JniPoc/JniPoc-1.0/AL2_x86_64/DEV.STD.PTHREAD/build/intermediates/ndkBuild/debug/obj/local/x86_64/libJniPoc.so] Error 1
那么,我需要做些什么才能完成编译工作,又需要做些什么才能让它在运行时工作呢?