我需要在我的本机库中获取Android唯一设备ID。据我所知,它可以用Java API完成,我需要使用JNI。我读了this,有类似的问题,但访问了不同的ID。但是这个解决方案需要引用JNIEnv来获取Java对象/方法。当从Java调用JNI方法时,这不是问题,JNIEnv将从Java传递。但是我怎么能得到JNIEnv"总计"本机代码?
答案 0 :(得分:1)
您的原生活动的入口点收到struct android_app*
作为其参数。 android_app
包含名为ANativeActivity*
的{{1}},activity
又包含名为JNIEnv*
的{{1}}。
为了能够从您的本机代码调用Android Java API方法,您必须首先将当前线程附加到VM,即:
env
(其中JNIEnv *env = state->activity->env;
JavaVM *vm = state->activity->vm;
(*vm)->AttachCurrentThread(vm, &env, NULL);
是state
)
答案 1 :(得分:-1)
我发现可以使用JavaVM访问JNIEnv,可以使用JNI invocation API创建。默认情况下,在Android NDK中,此功能不会导出到用户(来自platforms / android-19 / arch-arm / usr / include / jni.h):
/*
* VM initialization functions.
*
* Note these are the only symbols exported for JNI by the VM.
*/
#if 0 /* In practice, these are not exported by the NDK so don't declare them */
jint JNI_GetDefaultJavaVMInitArgs(void*);
jint JNI_CreateJavaVM(JavaVM**, JNIEnv**, void*);
jint JNI_GetCreatedJavaVMs(JavaVM**, jsize, jsize*);
#endif
但是这个功能 在我的设备上的/system/lib/libdvm.so 中显示。在我的代码中包含JNI_CreateJavaVM的函数定义并链接到从设备复制的libdvm后,我可以访问Android中的JavaVM创建。当然不建议这样做,但是,如果你需要它,你的设备libdvm支持它,你可以这样做。