2011-06-21 4 views
0

現在、SWIG/jniを使用してAndroidアプリのjavaからC++関数を呼び出しています。しかし、関数がjstringを返すたびに難しいです。 L()のjava/LANG /文字列JNI_OnLoadエラー:signature()でネイティブ関数のdeclを見つけることができませんLjava/lang/String

ERROR:; .plugin_nameネイティブLCOM /例/ swigJNIため供述見つけることができません:私は

ERROR ...アプリケーションの起動時にLogCatに次のエラーを取得します:ネイティブLCOM /例/ swigJNIため供述見つけることができません。.plugin_description:L()のjava/LANG /文字列

ここでは調べることが役に立つかもしれないいくつかのコードです...

SWIGはラッパーコードを生成:

SWIGEXPORT jstring JNICALL Java_swigJNI_1plugin_1name(JNIEnv *jenv, jclass jcls) { 
    jstring jresult = 0 ; 
    char *result = 0 ; 

    (void)jenv; 
    (void)jcls; 
    result = (char *)plugin_name(); 
    if (result) jresult = jenv->NewStringUTF((const char *)result); 
    return jresult; 
} 


SWIGEXPORT jstring JNICALL Java_swigJNI_1plugin_1description(JNIEnv *jenv, jclass  jcls) { 
    jstring jresult = 0 ; 
    char *result = 0 ; 

    (void)jenv; 
    (void)jcls; 
    result = (char *)plugin_description(); 
    if (result) jresult = jenv->NewStringUTF((const char *)result); 
    return jresult; 
} 

JNIネイティブメソッドの宣言:私がJNI_OnLoadを(実行することに成功してきた

static const JNINativeMethod methods[] = { 
    {"plugin_name", "()Ljava/lang/String", (void*) Java_swigJNI_1plugin_1name}, 
    {"plugin_description", "()Ljava/lang/String", (void*) Java_swigJNI_1plugin_1description} 
}; 

)とRegisterNativesを()関数はint型のを返すとき、ただし、文字列は、私にとって非常に問題となっています。私はこれらの機能がどのように見いだされていないのかをよく理解していません。私が紛失しているものがありますか?

答えて

2

ああの関数プロトタイプを含む、Cのヘッダファイルを生成し、私は馬鹿のように感じます!

私は文字列を使用していた署名がされました...それは本当にあるべきとき

()Ljava/lang/String 

...

()Ljava/lang/String; 

はセミコロンを忘れました。ああ!

0

Javaクラスのヘッダーファイル(生成されたcヘッダーファイル)をネイティブメソッドが定義されているC++コードに入れていますか。そう

、ネイティブメソッド実装

+0

はい、SWIGで生成されたC++ラッパーの先頭にあるファイル(plugin.h)に各ネイティブ関数を宣言しました。私はこれがC++の文字列とAndroidのNDKの問題かもしれないと思っています... – digitalmouse12