我正在尝试在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)
答案 0 :(得分:0)
为什么使用JNI将对象的ArratList转换为字符串数组?最好用Java做 - 更清晰的代码 - 并将字符串数组传递给JNI。
也就是说,LogCat说你的一个Java方法调用导致异常。它没有说哪一个。要进行调试,请在每次CallXXXMethod之后插入一个检查:
if(env->ExceptionOccurred())
{
__android_log_write(ANDROID_LOG_ERROR, "TRACKERS", "Error in (MethodName)");
env->ExceptionDescribe();
}
另外,“有什么帮助?”评论不具有建设性。请不要急于社区。这是一项免费服务,这里没有人欠你答案。