我需要帮助,因为我不知道该怎么做。我是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。
谢谢大家,对不起我的英语。
答案 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());
}