Android 尝试转换C+;时,decodeIndirectRef中的间接引用无效+;到爪哇 我试图把一些C++对象转换成java对象。 但我有一个奇怪的问题,我不知道为什么会发生 我所做的是获取C++对象的列表,从中创建java对象并将其添加到数组中。 它一直工作得很好,直到我在C++对象中添加了一个新的字符串(GeEngalAccess())。从那时起,它就不起作用了
这是我的密码:Android 尝试转换C+;时,decodeIndirectRef中的间接引用无效+;到爪哇 我试图把一些C++对象转换成java对象。 但我有一个奇怪的问题,我不知道为什么会发生 我所做的是获取C++对象的列表,从中创建java对象并将其添加到数组中。 它一直工作得很好,直到我在C++对象中添加了一个新的字符串(GeEngalAccess())。从那时起,它就不起作用了,android,c++,android-ndk,java-native-interface,Android,C++,Android Ndk,Java Native Interface,这是我的密码: jobject convertCPPTripsToJobject_v2(JNIEnv *env, std::list<Trip> *trips_cpp) { // create an ArrayList jclass clsArrayList = env->FindClass("java/util/ArrayList"); jmethodID methodIdInitArray = env->GetMethodID(cls
jobject convertCPPTripsToJobject_v2(JNIEnv *env, std::list<Trip> *trips_cpp) {
// create an ArrayList
jclass clsArrayList = env->FindClass("java/util/ArrayList");
jmethodID methodIdInitArray = env->GetMethodID(clsArrayList, "<init>", "()V");
jobject listTrips = env->NewObject(clsArrayList, methodIdInitArray);
if (clsArrayList != 0) {
// we get the id of the add method from the ArrayList
jmethodID midArrayListAdd = env->GetMethodID(clsArrayList, "add", "(Ljava/lang/Object;)Z");
if (midArrayListAdd != 0) {
// create different Java object from the cpp list
for (auto trip_cpp : *trips_cpp) {
// create a ParcourGreen object
jclass clsParcour = env->FindClass("net/pompoc/greenui/modele/ParcourGreen");
jmethodID methodIdInitParcour = env->GetMethodID(clsParcour, "<init>", "(IILjava/lang/String;Ljava/lang/String;FZLjava/lang/String;)V");
jobject parcour = env->NewObject(clsParcour, methodIdInitParcour,
trip_cpp.getId(),
trip_cpp.getType(),
env->NewStringUTF(trip_cpp.getStartDate().c_str()),
env->NewStringUTF(trip_cpp.getEndDate().c_str()),
trip_cpp.getSteps(),
trip_cpp.getIsPostProcessed() ? JNI_TRUE : JNI_FALSE,
env->NewStringUTF(trip_cpp.getCoordinates().c_str())
);
env->CallBooleanMethod(listTrips, midArrayListAdd, parcour);
}
}
}
return listTrips;
}
(当然不完全是0x00000000)
任何帮助都将不胜感激
编辑
下面是我的错误信息:
11-24 16:20:44.863: W/dalvikvm(16337): Invalid indirect reference 0xbea54328 in decodeIndirectRef
11-24 16:20:44.863: I/dalvikvm(16337): "main" prio=5 tid=1 RUNNABLE
11-24 16:20:44.863: I/dalvikvm(16337): | group="main" sCount=0 dsCount=0 obj=0x41835ea0 self=0x417304c8
11-24 16:20:44.863: I/dalvikvm(16337): | sysTid=16337 nice=0 sched=0/0 cgrp=apps handle=1074065748
11-24 16:20:44.863: I/dalvikvm(16337): | state=R schedstat=( 0 0 0 ) utm=100 stm=42 core=0
11-24 16:20:44.863: I/dalvikvm(16337): at net.pompoc.greenui.modele.ParcourGreen.<init>(ParcourGreen.java:-1)
11-24 16:24:36.289: E/dalvikvm(19526): VM aborting
11-24 16:24:36.289: A/libc(19526): Fatal signal 6 (SIGABRT) at 0x00004c46 (code=-6), thread 19526 (com.greenui)
11-24 16:20:44.863:W/dalvikvm(16337):decodeIndirectRef中的间接引用0xbea54328无效
11-24 16:20:44.863:I/dalvikvm(16337):“主”优先级=5 tid=1可运行
11-24 16:20:44.863:I/dalvikvm(16337):| group=“main”scont=0 dsCount=0 obj=0x41835ea0 self=0x417304c8
11-24 16:20:44.863:I/dalvikvm(16337):| sysTid=16337 nice=0 sched=0/0 cgrp=apps handle=1074065748
11-24 16:20:44.863:I/dalvikvm(16337):| state=R schedstat=(0 0 0)utm=100 stm=42 core=0
11-24 16:20:44.863:I/dalvikvm(16337):在net.pompoc.greenui.modele.ParcourGreen.(ParcourGreen.java:-1)
11-24 16:24:36.289:E/dalvikvm(19526):VM中止
11-24 16:24:36.289:A/libc(19526):0x00004c46处的致命信号6(SIGABRT)(代码=-6),线程19526(com.greenui)
编辑2
经过进一步调查,这似乎是我所有麻烦的原因:
jobject parcour = env->NewObject(clsParcour, methodIdInitParcour,
trip_cpp.getId(),
trip_cpp.getType(),
env->NewStringUTF(trip_cpp.getStartDate().c_str()),
env->NewStringUTF(trip_cpp.getEndDate().c_str()),
trip_cpp.getSteps(),
trip_cpp.getIsPostProcessed() ? JNI_TRUE : JNI_FALSE,
---> env->NewStringUTF(trip_cpp.getCoordinates().c_str()) <---
);
jobject parcour=env->NewObject(clsParcour,methodIdInitParcour,
trip_cpp.getId(),
trip_cpp.getType(),
env->NewStringUTF(trip_cpp.getStartDate().c_str()),
env->NewStringUTF(trip_cpp.getEndDate().c_str()),
trip_cpp.getSteps(),
trip_cpp.getIsPostProcessed()?JNI_TRUE:JNI_FALSE,
--->env->NewStringUTF(trip_cpp.getCoordinates().c_str())能否启用CheckJNI模式?这可能会为您提供更详细的诊断信息。此外,如果列表较大,您可能会溢出本地引用表;您可以通过显式删除在循环中创建的本地引用来避免这一情况。您还应该将FindClass和GetMethodID调用移到循环之外——它们是expensive,不需要在内部。我试图启用CheckJNI,但Logcat一直告诉我CheckJNI已关闭。我不知道它是否会帮助您,但当我在终端中执行“adb设备”时,我可以看到我的设备。当我在“adb外壳”中执行此操作时,我看不到它。。。
jobject parcour = env->NewObject(clsParcour, methodIdInitParcour,
trip_cpp.getId(),
trip_cpp.getType(),
env->NewStringUTF(trip_cpp.getStartDate().c_str()),
env->NewStringUTF(trip_cpp.getEndDate().c_str()),
trip_cpp.getSteps(),
trip_cpp.getIsPostProcessed() ? JNI_TRUE : JNI_FALSE,
---> env->NewStringUTF(trip_cpp.getCoordinates().c_str()) <---
);