0

私は、Javaファイルからarraylistを受け取るために、cppファイル内の次のコードを試しています。これがコードです

jobjectArray trackables;
JNIEXPORT void JNICALL
Java_com_putitout_buck_VideoPlayback_setTrackables(JNIEnv *env, jobject obj, jobject trackables_)
{

    // use the Array list
    jclass  ArrayList_class = env->FindClass( "java/util/ArrayList" );

    // to conver jobject to jstring
    jmethodID caster = env->GetMethodID(ArrayList_class, "toString", "()Ljava/lang/String;");

    // get two methods
    jmethodID Get_method            = env->GetMethodID( ArrayList_class, "get", "(I)Ljava/lang/Object" );
    jmethodID Size_method           = env->GetMethodID( ArrayList_class, "size", "()I" );

    // call java.lang.ArrayList.get()
    int NumElts = env->CallIntMethod(trackables_, Size_method);

    // allocate output array
    jclass objClass = env->FindClass("java/lang/String");
    trackables = env->NewObjectArray(NumElts, objClass, 0);

    // fetch all the items
    for(int i = 0 ; i < NumElts ; i++)
    {
        // call java.lang.ArrayList.get(int index) method
        // Not sure about the parameter passing here
        jobject Tmp = env->CallObjectMethod(trackables_, Get_method, i);

        jstring Str = (jstring)env->CallObjectMethod(Tmp, caster);

        __android_log_print(ANDROID_LOG_ERROR, "TRACKERS", "%s", Str);

        // get the length
        int StrLen = env->GetStringLength(Str);

        env->SetObjectArrayElement(trackables, i, Str);
    }
}

以下は私がJavaファイルで宣言しているコードです

public native void setTrackables(ArrayList<String> trackables);

以下はログにあります。

10-24 17:45:44.555: W/dalvikvm(27400): JNI WARNING: JNI method called with exception pending
10-24 17:45:44.555: W/dalvikvm(27400):              in Lcom/putitout/buck/VideoPlayback;.setTrackables:(Ljava/util/ArrayList;)V (GetMethodID)
10-24 17:45:44.555: W/dalvikvm(27400): Pending exception is:
10-24 17:45:44.555: E/dalvikvm(27400): VM aborting
10-24 17:45:44.560: A/libc(27400): Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1)
4

1 に答える 1

0

JNI を使用してオブジェクトの ArratList を文字列の配列に変換するのはなぜですか? Javaでそれを行う方が良いです-よりクリーンなコード-そして文字列の配列をJNIに渡します。

とはいえ、LogCat は、Java メソッド呼び出しの 1 つが例外を引き起こしていることを示しています。どっちとは言いません。デバッグするには、すべての CallXXXMethod の後にチェックを挿入します。

if(env->ExceptionOccurred())
{
    __android_log_write(ANDROID_LOG_ERROR, "TRACKERS", "Error in (MethodName)");     
    env->ExceptionDescribe();
}

また、「何かお役に立てますか?」コメントは建設的ではありません。コミュニティを急がないでください。これは無料のサービスです。ここにいる誰もあなたに回答する義務はありません。

于 2012-10-24T13:22:53.970 に答える