Java 和 JNI 全局变量

Java and JNI global variables

本文关键字:全局变量 JNI Java      更新时间:2023-10-16

我需要帮助,因为我不知道该怎么办。我是 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 文件中定义像全局变量一样的套接字。

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

也许,这不是最好的方法,但我们正在这样做。 我们将一个从 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());
}