簡體   English   中英

Java和JNI全局變量

[英]Java and JNI global variables

我需要幫助,因為我不知道該怎么辦。 我是JNI的新手。

我正在開發一個Android應用程序,它必須使用especific協議(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";
}

並想做的其他方法是:

 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全局變量來存儲de socket對象並從JNI訪問它,或者是否有可能像cpp文件中的全局變量一樣定義socket。

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

也許這不是最好的方法,但我們正在這樣做。 我們將JNI的指針作為jlong​​返回到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());
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM