Android:从JNI线程传递数据到Java程序

3
我正在开发一个与服务器通信的jni客户端软件。我可以建立连接,读取所需信息并将其返回给我的Java程序。现在我想让连接无限期地保持,也就是说,连接已经建立,信息应该在无限循环中被读取(我不想在每个jni函数调用时断开和重新连接)。是否可以从工作的jni线程传递一个字节数组到我的Java程序中?
非常感谢。
此致敬礼,
Thomas

为什么不一开始就让Java进行服务器通信呢? - technomage
我该如何将Java中的服务器连接传递到JNI? - user1744012
"jni-client-software"有什么特殊之处,使你无法使用Java而不是JNI来完成相同的工作? - technomage
1个回答

1
“在工作的JNI线程中,是否可以将字节数组传递给我的Java程序?”
您可以在其中一个Java类中创建静态方法,然后从JNI代码中使用参数调用此方法。以下是一些代码:
Java端:
package com.mysuper.game;
public class MyApp {
    public static void callMeFromJNI(byte[] data) {
        // ...
    }
}

并且C++代码在工作线程上运行:

JavaVM *vm;
// use vm->AttachCurrentThread(&env, 0); in thread function to get valid JNI interface pointer, on thread end use DetachCurrentThread().
JNIEnv *env;

void myFunc() {

    // some test data to send
    const int len = 32;
    char data[len] = {0,1,2,3,4};

    jclass app = env->FindClass("com/mysuper/game/MyApp");
    jmethodID sendDataToJava = env->GetStaticMethodID(app, "callMeFromJNI", "([B)V");
    jbyteArray bArray = env->NewByteArray(len);
    char *bytes = (char *)env->GetByteArrayElements(bArray, 0);
    memcpy( bytes, data, len);
    env->ReleaseByteArrayElements(bArray, bytes, JNI_ABORT);
    env->CallStaticVoidMethod(app, sendDataToJava, bArray);
}

了解更多关于此工作原理的信息,请查看:

Java Native Interface 6.0 规范


你不能仅仅使用"env...from JNI_OnLoad"。你需要保持对JavaVM的静态引用,然后从中首先附加本地线程,然后获取一个新的JNIEnv指针。通常情况下,你不应该依赖于在一个线程上获取的JNIEnv指针在任何其他线程上都是有效的。 - technomage

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接