【发布时间】:2012-04-20 05:32:48
【问题描述】:
我想从一个接收来自另一个可执行文件的回调的 cpp 文件调用 Java 类方法。
为了实现这一点,我使用 .cpp 文件中的 android::AndroidRuntime::getJavaVM() 方法检索了一个 JavaVM 指针,该文件直接接收 JNI 方法调用。我通过构造函数将这个 JavaVM 指针共享到最终的 .cpp 文件,我在该文件中调用所需的 Java 方法,如下所示:
/* All the required objects(JNIEnv*,jclass,jmethodID,etc) are appropriately declared. */
**JNIEnv* env;
jvm->AttachCurrentThread(&env, NULL);
clazz = env->FindClass("com/skype/ref/NativeCodeCaller");
readFromAudioRecord = env->GetStaticMethodID(clazz, "readFromAudioRecord", "([B)I");
writeToAudioTrack = env->GetStaticMethodID(clazz, "writeToAudioTrack", "([B)I");**
但是,我在运行此代码时遇到 SIGSEGV 错误。
根据 JNI 文档,这似乎是在任意上下文中获取 JNIEnv 的适当方式:http://java.sun.com/docs/books/jni/html/other.html#26206
我们将不胜感激。
问候, 尼拉杰
【问题讨论】:
-
什么是 android::AndroidRuntime::getJavaVM) ?那不是 NDK 公共 API 功能。您正在使用未记录的东西。要在 NDK 中获取 JavaVM*,您必须实现 JNI_OnLoad 全局函数,该函数会在您的共享库被加载时自动调用。
-
感谢您的回复.. android.wooyd.org/JNIExample/#NWD1sCYeT-J - 本文档很好地介绍了 JNI_OnLoad,其中使用了 android::AndroidRuntime::registerNativeMethods()。你确定 android::AndroidRuntime 没有记录吗?
-
是的,它在普通用户 NDK 代码中没有记录功能。阅读 JNI 文档(来自 Sun)并检查 NDK 文件夹中的 docs/STABLE-APIS.html 文件以获取其他合法和文档化的 API。
-
该文档是关于 NDK 出现之前的 Android 编程的。阅读第一部分“重要通知”。
-
再次感谢您指出这一点。我删除了对 android::AndroidRuntime::getJavaVM() 的调用,并改用 JNI_onLoad 来传播 JavaVM* 指针。但是,仍然得到相同的 SIGSEGV 故障。有什么想法吗?
标签: multithreading android-ndk java-native-interface