[英]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.