将字符串数组传递给NDK JNI方法

时间:2012-10-24 12:49:23

标签: java android android-ndk java-native-interface

我正在尝试在cpp文件中跟踪代码以从java文件接收arraylist。这是代码

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)

1 个答案:

答案 0 :(得分:0)

为什么使用JNI将对象的ArratList转换为字符串数组?最好用Java做 - 更清晰的代码 - 并将字符串数组传递给JNI。

也就是说,LogCat说你的一个Java方法调用导致异常。它没有说哪一个。要进行调试,请在每次CallXXXMethod之后插入一个检查:

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

另外,“有什么帮助?”评论不具有建设性。请不要急于社区。这是一项免费服务,这里没有人你答案。