2012-11-05 117 views
2

我正在開發一個jni-client-software,它應該與服務器通信。我可以建立連接,可以讀出我需要的信息並將其返回給我的java程序。現在我想要連接無限,這意味着連接已建立,信息應該在無限循環中讀出(我不想斷開並重新連接每個jni函數調用)。是否有可能從正在工作的jni中傳遞一個字節數組到我的java程序?Android:將數據從jni線程傳遞到java程序

非常感謝。

親切的問候

托馬斯

+0

爲什麼不首先從Java進行服務器通信? – technomage

+0

如何將服務器連接從java傳遞給jni? – user1744012

+0

「jni-client-software」有什麼特別之處,可以阻止你用Java代替JNI執行相同的工作? – technomage

回答

1

「是否有可能從工作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); 
} 

更多:

Java Native Interface 6.0 Specification

+0

你不能只使用「env ...從JNI_OnLoad」。您需要保留對JavaVM的靜態引用,並從該引用中首先附加本機線程,然後獲取新的JNIEnv指針。您通常不應該依賴在一個線程上獲得的JNIEnv指針在任何其他線程上有效。 – technomage

+0

感謝您指出這一點,我編輯了這部分 – marcinj

+0

我們如何獲得JNIEnv指針? – usman

相關問題