【问题标题】:Android ndk. Can't get reference to JVM安卓ndk。无法获得对 JVM 的引用
【发布时间】:2013-05-04 16:57:41
【问题描述】:

几天前,我开始玩 android NDK。尝试编译书中的一个示例程序时出现了一个小问题。

所以这里我需要获取JavaVM的引用。

// Global env ref (for callbacks)
static JavaVM *g_VM;

JNIEXPORT jint JNICALL Java_jni_Natives_LibMain
  (JNIEnv * env, jclass class, jobjectArray jargv)
{
    // obtain a global ref to the caller jclass
    (*env)->GetJavaVM(env, &g_VM); ...

Eclipse 说“method 'GetJavaVM()' could not be resolved”,就像其他包含(*env) object 方法的行一样。

包含目录有路径:C:\programs\IDE\adt-bundle-windows-x86_64-20130219\android-ndk-r8e\platforms\android-14\arch-arm\usr\include 所以我不认为它可能是包含路径的东西,但是我可能是错的。

【问题讨论】:

  • 嗯,添加一个 `#include "jni.h" 并且只使用确切的源编译对我来说没问题。
  • 它对我有用,但一段时间后,我认为 eclipse 中发生了一些事情。我还尝试清理、重建并创建一个新项目。
  • 明确一点:它使用 NDK 编译器编译和运行,但 Eclipse 将语句标记为错误?

标签: android c android-ndk


【解决方案1】:

您正在编译 .cpp 文件吗? 对 C 和 C++ 有不同的 JNIEnv 实现,并且您使用的是 C 版本。在 C++ 中,您的代码如下所示:

 JNIEXPORT jint JNICALL Java_jni_Natives_LibMain
   (JNIEnv * env, jclass class, jobjectArray jargv)
 {
     // obtain a global ref to the caller jclass
     env->GetJavaVM(&g_VM); ...

获取 JavaVM 引用的常规方法是在 JNI_OnLoad 中:

 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* aReserved)
 {
     // cache java VM
     g_VM = vm;
     ...
 }

【讨论】:

  • 谢谢你的答案。它是 .c 文件。问题是 Eclipse 没有识别 (*env)->GetJavaVM() 方法,它像错误一样被下划线(只有方法,而不是 (*env) 变量)。它也无法识别 (*env)->GetObjectArrayElement, (*env)->GetStringUTFChars() 等...
【解决方案2】:

这是星星

(*env)->GetJavaVM(env, &g_VM);

不正确

env->GetJavaVM(env, &g_VM);

是正确的并且

(*env).GetJavaVM(env, &g_VM);

也是正确的。

【讨论】:

  • 在 C 中,(*env)->Function(env, arg) 是正确的。在 C++ 中,env->Function(arg) 是正确的。 jni.h 中的 C 和 C++ 声明不同且不兼容。
猜你喜欢
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多