2016-12-10 11 views
1

Это мой некоторые Java код:JNI ОШИБКА: попытка передать экземпляр java.lang.String в качестве аргумента

public class MainTest{ 

/* 
... 
*/ 

    public native void invokeByCPlusPlus(); 

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

и я хочу использовать JNI называть мой метод Java «appendLine (String ... метод СПО)», когда я называю invokeByCPlusPlus() в Java:

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; 
} 

тогда я получаю сообщение об ошибке: JNI оШИБКА: попытка передать экземпляр java.lang.String в качестве аргумента 1 к мочеиспусканию com.hengye. ndktest.MainTest.appendLine (java.lang.String [])

только я объявляю метод appendLine как этот код работает нормально:

private void appendLine(String str1, String str2){ 

    System.out.print(str1 + str2); 

} 

Как я могу решить эту проблему?

ответ

1

Вы не можете использовать jvalue[]. Вам нужно использовать jobjectArray.

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); 

Обратите внимание, что я называю CallVoidMethod вместо CallVoidMethodA.

+0

Большое спасибо, но он работает после изменения кода: 'jclass stringClass = env-> FindClass (" java/lang/String "); jobjectArray values ​​= env-> NewObjectArray (3, stringClass, env-> NewStringUTF ("")); ' –