android - 无法在 JNI 中更新 jobobject

标签 android c java-native-interface

我的应用程序是一个带有一些 native 代码的 Android 应用程序。

Java 代码通过 new Thread(new Runnable) 启动一个线程,在 native 代码中,我通过 AttachCurrentThread 将该线程附加到 JVM。

在该线程中调用的 native 函数是一个无限循环,它将监听简单事件( bool 变量)并调用另一个 native 函数,该函数通过使用正确的 JNIEnv 指针和 jobject 将在 Java 端填充 2 个 java 变量,调用 void 方法来显示数据。该循环的原因是正常调用该函数的开销(需要进行大量分配和销毁)很可能是巨大的。

唯一的问题是,虽然我可以更新 JNIEnv 指针,但我不知道如何为 jobobject 执行此操作。

我所说的 jobject 是指通过函数调用传递给 native 代码的 jobject,如下所示

jint Java_com_example_example_MainActivity_NativeFunc( JNIEnv* env,
                                              jobject obj)
{
    return;
}

最佳答案

The Java code starts a thread via new Thread(new Runnable), in the native code, I attach that thread to the JVM via AttachCurrentThread.

您不必将 JVM 附加到使用 Java 代码创建的线程,它已经附加了。

如果我正确理解你的问题,你会得到一个jobobject一次,并希望稍后在其他 native 方法中访问该对象。为此,您可以使用 NewGlobalRef :

jobject myGlobalReference = env->NewGlobalRef(obj);

您可以将该作业对象存储在全局C/C++变量中并在以后使用它。它将保持有效,直到 JVM 终止或您使用 DeleteGlobalRef 删除引用。 。请记住,只要您不删除全局引用,如果对引用对象的所有 Java 引用都消失了,垃圾回收将不会回收引用的对象!

关于android - 无法在 JNI 中更新 jobobject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12166590/

相关文章:

c - NodeJS中的父子进程

Java JNI GetMethodID 返回 NULL

java - 安卓/Java : How to call methods of an object created on a different thread?

android - 是否有可以增加所有其他应用程序显示大小的 android 应用程序(或方法)?

android - 仅在 Android 上没有可用的互联网连接时,PhoneGap 应用程序停止

使用 ZeroMQ 时从线程调用 system()

c - 如何为 lex 和 yacc 中的文字指定索引值?

c - JNI ThrowNew 什么时候会失败?

android - 无法使用 Android Studio 创建新的 Android 项目

android - 什么时候 Intent 额外在 Activity 之间变为空?