0

我需要在我的本机库中获取 Android 唯一设备 ID。据我所知,它可以用 Java API 完成,我需要使用 JNI。我读了这个,有类似的问题,但是访问了不同的 ID。但是这个解决方案需要参考 JNIEnv 来获取 Java 对象/方法。当从 Java 调用 JNI 方法时,这没有问题,JNIEnv 将从 Java 传递。但是我如何才能获得“全部”本机代码的 JNIEnv 呢?

4

2 回答 2

1

您的本机活动的入口点接收 astruct android_app*作为其参数。android_app包含一个ANativeActivity*named activity,而后者又包含一个JNIEnv*named env

为了能够从您的本机代码调用 Android Java API 方法,您必须首先将当前线程附加到 VM,即:

JNIEnv *env = state->activity->env;
JavaVM *vm = state->activity->vm;
(*vm)->AttachCurrentThread(vm, &env, NULL);

(在state哪里struct android_app*

于 2014-07-29T08:55:37.327 回答
-1

我发现 JNIEnv 可以用 JavaVM 访问,它可以用 JNI调用 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 支持它,你可以这样做。

于 2014-07-31T11:55:38.590 回答