2012-10-24 48 views
0

我想下面的代码在cpp文件中从java文件接收arraylist。下面是代码将字符串数组传递给NDK JNI方法

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) 
+0

我需要导入cpp文件中的任何东西吗? –

+0

任何人的帮助? –

回答

0

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

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

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

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