JNIEnv从本机代码获取ANDROID_ID

时间:2014-07-29 07:54:42

标签: android c java-native-interface jnienv

我需要在我的本机库中获取Android唯一设备ID。据我所知,它可以用Java API完成,我需要使用JNI。我读了this,有类似的问题,但访问了不同的ID。但是这个解决方案需要引用JNIEnv来获取Java对象/方法。当从Java调用JNI方法时,这不是问题,JNIEnv将从Java传递。但是我怎么能得到JNIEnv"总计"本机代码?

2 个答案:

答案 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支持它,你可以这样做。