2016-12-10 5 views
1

これは私のいくつかのJavaコードであるとして、java.lang.Stringでインスタンスを渡すための試み:JNIエラー:引数

public class MainTest{ 

/* 
... 
*/ 

    public native void invokeByCPlusPlus(); 

    private void appendLine(String... strs){ 
     for(String str : strs) { 
      System.out.println("get s : " + str); 
     } 
    } 
} 

と私は私のJavaメソッド「appendLine(文字列を呼び出すJNI利用したいです...私はJavaでinvokeByCPlusPlus()メソッドを呼び出すときSTRS)が」: JNIのERROR:

extern "C" void 
Java_com_hengye_jnitest_MainTest_invokeByCPlusPlus(JNIEnv *env, jobject instance) { 

    jclass clazz = env->GetObjectClass(instance); 
    jmethodID methodId = env->GetMethodID(clazz, "appendLine", "([Ljava/lang/String;)V"); 

    jvalue values[2]; 
    jvalue *val1 = new jvalue(); 
    val1->l = env->NewStringUTF("invoke by C++ 1"); 
    values[0] = *val1; 

    jvalue *val2 = new jvalue(); 
    val2->l = env->NewStringUTF("invoke by C++ 2"); 
    values[1] = *val2; 

    env->CallVoidMethodA(instance, methodId, values); 
    return; 
} 

を、私はエラーを取得する試みは無効com.hengyeへの引数1として、java.lang.Stringでインスタンスを渡します。 ndktest.MainTest.appendLine(java.lang.String [])

唯一の私は、通常、このようなappendLineメソッドにコードの実行を宣言します。

private void appendLine(String str1, String str2){ 

    System.out.print(str1 + str2); 

} 

どのように私はこの問題を解決することができますか?

答えて

1

jvalue[]は使用できません。 jobjectArrayを使用する必要があります。私はCallVoidMethod代わりのCallVoidMethodAを呼び出す

jobjectArray values = env->NewObjectArray(2, clazz, env->NewStringUTF("")); 
env->SetObjectArrayElement(values, 0, env->NewStringUTF("invoke by C++ 1")); 
env->SetObjectArrayElement(values, 1, env->NewStringUTF("invoke by C++ 2")); 
env->CallVoidMethod(instance, methodId, values); 

注意。

+0

ありがとう、それはいくつかのコードを変更した後に動作します: 'jclass stringClass = env-> FindClass(" java/lang/String "); jobjectArray values = env-> NewObjectArray(3、stringClass、env-> NewStringUTF( "")); ' –