2017-07-19 215 views
2

我需要幫助,因爲我不知道該怎麼做。我是JNI的新手。Java和JNI全局變量

我正在開發一個Android應用程序,它必須使用特定的協議(OpenIGTLink)。

要使用此協議,我使用C庫。問題是我需要定義一個全局變量來存儲連接。您可以在下面的例子中看到:

igtl::ClientSocket::Pointer socket; 


Java_es_iac_iactec_infraredsend_Comunicacion_OpenIGTLink_connect(
    JNIEnv *env, 
    jobject mjobject, 
    jstring host, 
    jint port) { 
socket = igtl::ClientSocket::New(); 

const char *chost = env->GetStringUTFChars(host, 0); 

int r = socket->ConnectToServer(chost, port); 
if (r != 0) { 

    return (jstring) "Cannot connect to the server."; 
} 

return (jstring) "ok"; 
} 

和其他方法iwant做:

Java_es_iac_iactec_infraredsend_Comunicacion_OpenIGTLink_send() { 
    igtl::ImageMessage::Pointer imgMsg = igtl::ImageMessage::New(); 
    imgMsg->SetDimensions(size); 
    imgMsg->SetSpacing(spacing); 
    imgMsg->SetScalarType(scalarType); 
    imgMsg->SetDeviceName("ImagerClient"); 
    imgMsg->SetSubVolume(svsize, svoffset); 
    imgMsg->AllocateScalars(); 
    imgMsg->Pack(); 

    socket->Send(imgMsg->GetPackPointer(), imgMsg->GetPackSize()); 
} 

我不知道如果我要宣佈一個java全局變量來存儲德套接字對象和從JNI訪問它,或者可以在cpp文件中定義像全局變量這樣的套接字。

謝謝大家,對不起我的英語。

+0

有不被任何這樣的事情作爲一個Java目標變量,它是很難知道你在說什麼。 – EJP

+0

謝謝你的回覆。我試圖解釋我的項目。我想用movil相機發送OpenIGTLink圖像。我用C++中的代碼將一些圖像從sdcard發送到服務器。現在我想從卡馬拉發送圖像,所以我有一個SurfaceView來預覽相機圖像。我正在考慮的過程是,形成Java,調用JNI函數來建立與服務器的連接,然後從Java調用另一個JNI函數來發送圖像。非常感謝! –

回答

0

也許,這不是最好的方法,但我們這樣做。 我們正在返回一個從JNI到Java的指針,並將它傳遞給每個調用。它像一個指向方法中對象的自指針一樣工作。在你的情況下,它看起來在某種程度上是這樣

jlong Java_es_iac_iactec_infraredsend_Comunicacion_OpenIGTLink_connect(
    JNIEnv *env, 
    jobject mjobject, 
    jstring host, 
    jint port) { 
    /*some code*/ 
    return reinterpret_cast<jlong>(socket); 
} 

然後

Java_es_iac_iactec_infraredsend_Comunicacion_OpenIGTLink_send(jlong pointer) { 
    /*some code*/ 
    igtl::ClientSocket::Pointer socket = reinterpret_cast<igtl::ClientSocket::Pointer>(pointer) 
    socket -> Send(imgMsg->GetPackPointer(), imgMsg->GetPackSize()); 
} 
+0

非常感謝您的回答。當我嘗試做你的解決方案時,我得到了下一個編譯器錯誤:錯誤:錯誤:沒有匹配轉換的C風格轉換從'igtl :: ClientSocket :: Pointer'(又名'SmartPointer ') jlong​​'(又名'long')。所以我不能使用你的解決方案。你有其他想法嗎?非常感謝你!! –

+0

我不是C++的專家,但你認爲你應該使用reinterpret_cast。我會嘗試改變這個例子。 –