我正在开发一个 jni-client-software,它应该与服务器通信。我可以建立连接,可以读出我需要的信息并将其返回给我的 java 程序。现在我想无限连接,这意味着连接已经建立,并且应该在无限循环中读取信息(我不想断开连接并重新连接每个 jni 函数调用)。是否可以将字节数组从工作的 jni 踏板传递给我的 java 程序?
非常感谢。
亲切的问候
托马斯
我正在开发一个 jni-client-software,它应该与服务器通信。我可以建立连接,可以读出我需要的信息并将其返回给我的 java 程序。现在我想无限连接,这意味着连接已经建立,并且应该在无限循环中读取信息(我不想断开连接并重新连接每个 jni 函数调用)。是否可以将字节数组从工作的 jni 踏板传递给我的 java 程序?
非常感谢。
亲切的问候
托马斯
“是否可以将字节数组从工作的 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);
}
有关其工作原理的更多信息,请查看: