Java和JNI全局变量

时间:2017-07-19 15:07:05

标签: java android c++ java-native-interface

我需要帮助,因为我不知道该怎么做。我是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";
}

并且在其他方​​法中我想做:

 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。

谢谢大家,对不起我的英语。

1 个答案:

答案 0 :(得分:0)

也许,这不是最好的方式,但我们这样做。 我们将从JNI返回到Java的指针作为jlong​​并将其传递给每个调用。它的工作方式类似于方法中对象的自指针。在你的情况下,它看起来会像这样

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());
 }