2016-07-11 7 views
1

こんにちは私は現在、C++フレームワークがJavaプログラムに統合されるプロジェクトに取り組んでおり、JNIの探索を開始しました。私は現在、型変換に苦しんでおり、C++が初めてのので、Javaのネイティブメソッドで宣言する必要がある引数の型は何ですか。Java JNI UnsatisfiedLinkErrorポインタへのC charポインタ

私は次のメソッドを持つCPP-ファイルで:

using namespace std; 

int main(int argc,char**argv) 
{ 
    //do stuff 
} 

マイ対応するJavaクラスは、次のようになります。

public class JniTest { 

static { 
    System.loadLibrary("plain2snt"); 
} 

public JniTest() { 

    char[][] arguments = new char[][] {"resourceFile1.txt".toCharArray(), "resourceFile2.txt".toCharArray()}; 
    main(2, arguments); 
} 

public native int main(int argc, char[][] argv); 

} 

とJavaクラスのヘッダファイルは以下の通りです:

#include <jni.h> 
/* Header for class testPackage_JniTest */ 

#ifndef _Included_testPackage_JniTest 
#define _Included_testPackage_JniTest 
#ifdef __cplusplus 
extern "C" { 
#endif 
/* 
* Class:  testPackage_JniTest 
* Method: main 
* Signature: (I[[C)I 
*/ 
JNIEXPORT jint JNICALL Java_testPackage_JniTest_main 
    (JNIEnv *, jobject, jint, jobjectArray); 

#ifdef __cplusplus 
} 
#endif 
#endif 

実行しようとすると、次のエラーが表示されます。

私は既にGoogleとJNI APIのリファレンスなどを使ってJavaとC++の間で一致する型を検索しましたが、Javaのポインタ型のchar型を処理する方法が見つかりませんでした。 cppフレームワークのchar **と一致するargv引数のJavaクラスの実際の型定義は何でしょうか?

答えて

0

JVMがネイティブメソッドを呼び出そうとするとき、それはjavahで生成されたヘッダーを指す関数として実装していると見なします。私。あなたのライブラリはどこかに含まれていなければならない

JNIEXPORT jint JNICALL Java_testPackage_JniTest_main 
    (JNIEnv *, jobject, jint, jobjectArray) { 
    /* do stuff */ 
} 

キャッチされた例外は、ネイティブメソッドの実装がないという主張です。

argumentsは、配列の配列の配列ではなく、配列Stringと同じように渡す方がはるかに便利です。

JNIEXPORT jint JNICALL Java_testPackage_JniTest_main (JNIEnv *, jobject thiz, jint argc, jobjectArray argv) { 
    for(jsize i = 0; i < env->GetArrayLength(argv); i++) { 
     jstring str = (jstring)env->GetObjectArrayElement(argv, i); 
     const char *c_str = env->GetStringUTFChars(str, NULL); 
     /* do whatever you want with c_str */ 
     env->ReleaseStringUTFChars(str, c_str); 
    } 

    /* ... */ 
} 
+0

があなたの速い応答をありがとう:あなたは、次の方法で引数を取得することができ++ Cで

public JniTest() { String[] arguments = new String[] {"resourceFile1.txt", "resourceFile2.txt"}; main(2, arguments); } public native int main(int argc, String[] argv); } 

!私はJNIEXPORT jintを私のライブラリに追加しました。少なくともこれは、私がcppファイルにこのメソッドを実装することによって(あなたが提供し、それを適用したコードの3番目の部分を与えて)行い、cppファイルをdllに再コンパイルしたと思います。これは正常に機能しましたが、私はまだサメエラーが発生します。 JNI APIとそのワークフローに関する何かを誤解する必要がありますか? – SvenBTU

+0

さて、私は問題を解決しました。私のJavaクラスでは、そのクラスのオブジェクトを初期化せず、ネイティブのメインメソッドを呼び出しただけです。だから私は基本的にJniTest()をpublic JniTest(){String [] arguments = new String [] {"resourceFile1.txt"、 "resourceFile2.txt"}に変更しました。 JniTestテスト=新しいJniTest(); test.main(2、arguments); } – SvenBTU

関連する問題