我正在開發一個jni-client-software,它應該與服務器通信。我可以建立連接,可以讀出我需要的信息並將其返回給我的java程序。現在我想要連接無限,這意味着連接已建立,信息應該在無限循環中讀出(我不想斷開並重新連接每個jni函數調用)。是否有可能從正在工作的jni中傳遞一個字節數組到我的java程序?Android:將數據從jni線程傳遞到java程序
非常感謝。
親切的問候
托馬斯
我正在開發一個jni-client-software,它應該與服務器通信。我可以建立連接,可以讀出我需要的信息並將其返回給我的java程序。現在我想要連接無限,這意味着連接已建立,信息應該在無限循環中讀出(我不想斷開並重新連接每個jni函數調用)。是否有可能從正在工作的jni中傳遞一個字節數組到我的java程序?Android:將數據從jni線程傳遞到java程序
非常感謝。
親切的問候
托馬斯
「是否有可能從工作JNI胎面到我的Java PROGRAMM傳遞一個字節數組?」
您可以在您的某個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);
}
更多:
你不能只使用「env ...從JNI_OnLoad」。您需要保留對JavaVM的靜態引用,並從該引用中首先附加本機線程,然後獲取新的JNIEnv指針。您通常不應該依賴在一個線程上獲得的JNIEnv指針在任何其他線程上有效。 – technomage
感謝您指出這一點,我編輯了這部分 – marcinj
我們如何獲得JNIEnv指針? – usman
爲什麼不首先從Java進行服務器通信? – technomage
如何將服務器連接從java傳遞給jni? – user1744012
「jni-client-software」有什麼特別之處,可以阻止你用Java代替JNI執行相同的工作? – technomage