1

私のネイティブ関数は char ** を引数として受け入れます。JNIを使​​用して渡す方法を教えてください。

私のネイティブ関数プロトコル - long processInput(const char* str1 , char ** output);

ありがとう

4

2 に答える 2

1

これは(まだ)完全な答えではありませんが、コメントするには長すぎます。

Java に自然に適合するように、Java でネイティブ関数宣言を作成することから始めます。おそらく、次のいずれかが適切でしょう。

static native String processInput(String input);
static native byte[] processInput(byte[] input);

次に、関数をラップするには、次のことを知っておく必要があります。

  • 戻り値と各パラメータの意味。
  • charパラメータが文字列を表す 場合、
    • キャラクターセット、
    • エンコーディングと
    • 長さ/ターミネーター プロトコル。
  • 呼び出し元が割り当ておよび/または解放すると予想されるメモリはどれですか?
  • 呼び出し先?
  • 戻り値が何らかの特別な値である場合、それは関係ないということですか? その場合、ラッパーは Java 例外をスローするか、文字列、配列、または長さゼロの配列をoutput返す必要がありますか?nullnull
  • Java は文字列に Unicode を使用します。関数で使用される文字セットに文字をマップできない場合はどうなりますか?
于 2013-06-14T20:08:14.473 に答える
1

これを直接行うことはできませんが、JNI を使用して任意の関数名を簡単に呼び出すこともできません。そのため、単純なネイティブ ラッパー メソッドが必要になります。Android ndk ディストリビューションの samples/ ディレクトリにある hello-jni サンプルから始めて、そのままビルドしてすべてが機能することを確認してから、次のように変更します。

long processInput(const char* str1 , char ** output);

jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
    //return (*env)->NewStringUTF(env, "Hello from JNI !");
    char *outputstr; 
    processInput("some input", &outputstr); 
    return (*env)->NewStringUTF(env, outputstr); 
}

エラーチェックを追加したり、jni から入力文字列を取得したりすることもあるでしょう。

于 2013-06-14T16:36:12.007 に答える