2017-07-19 20 views
2

私は何をするべきか分からないので、助けが必要です。私はJNIの初心者です。Javaおよび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"; 
} 

てみませんか他の方法のiwant中:

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のグローバル変数を宣言する必要がある場合、私は知らないし、 JNIからアクセスするか、またはcppファイル内にグローバル変数のようなソケットを定義できるかどうかを調べます。

はすべて、私の英語のために残念に感謝します。

+0

のようになります、あなたが何を言ってるのか知ることは困難です。 – EJP

+0

お返事ありがとうございます。私は私のプロジェクトを説明しようとします。私はmovilカメラからOpenIGTLink画像を送っていきたいです。私は、C + +でコードをいくつかの画像をサーバーに送信するsdcardからです。今私はカマラから画像を送信したいので、私はカメラ画像をプレビューするためにSurfaceViewを持っています。私が考えているproccesは、Javaのフォームは、サーバーへの接続を確立するためにJNI関数を呼び出し、javaから画像を送信する別のJNI関数を呼び出します。 Thnakあなたは非常に! –

答えて

0

たぶん、それが最善の方法ではありませんが、我々はそれをやっています。 JNIからjlong​​としてJavaにポインターを戻し、すべての呼び出しに渡します。メソッド内のオブジェクトへの自己ポインタのように機能します。あなたのケースでは、それは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()); 
} 
+0

ありがとうございます。エラー:エラー: 'igtl :: ClientSocket :: Pointer'(別名SmartPointer ')からCスタイルのキャストの一致する変換がありません' jlong​​ '(別名「long」)。だから私はあなたのソリューションを使用することはできません。他のアイデアはありますか?どうもありがとうございました!! –

+0

私はC++のプロではありませんが、reinterpret_castを使うべきだと思います。この例を変更しようとします。 –

関連する問題