Android, JNI вызывают конструктор Java в переполнении стека

У меня есть следующий класс Java:

 public class SHPObject {
public int nSHPType;
int nShapeId;
public int nParts;
int[] panPartStart;
int panPartType;
int nVertices;
double[] padfX;
double[] padfY;

public SHPObject(int nSHPType, int nParts, int[] panPartStart, double[] padfX, double[] padfY ){
this.nSHPType = nSHPType;
this.nParts = nParts;
this.panPartStart = panPartStart;
this.padfX = padfX;
this.padfY = padfY;
}

}

И я пытаюсь создать объект этого класса в C ++. Это мой код для этого:

    jclass shpObjectClass = env->FindClass("com/example/kaczor/tmc_shpreader/Shape/Shapes/SHPObject");
jmethodID shpObjectConstructor = env->GetMethodID(shpObjectClass, "<init>", "(II[I[D[D)V");
jobject recognition_result;
SHPObject* a = new SHPObject[nEntities];
for(i = 0; i < nEntities; i++){
a[i] = *SHPReadObject(handle,i);
recognition_result = env->NewObject(
shpObjectClass, shpObjectConstructor, a[i].nSHPType, a[i].nParts, *a[i].panPartStart, *a[i].padfX, *a[i].padfY);
...
}

К сожалению, при выполнении этого кода мое приложение закрывается. Хотя, когда я изменяю свой конструктор в Java и сигнатуру метода в C ++:

public SHPObject(int nSHPType, int nParts, int[] panPartStart)

methodID shpObjectConstructor = env->GetMethodID(shpObjectClass, "<init>", "(II[I)V");

все отлично работает Таким образом, существует проблема с передачей переменных double []. Я не могу понять, что не так. Это часть трассировки стека после выполнения этого кода (не совсем уверен, какую часть я должен дать, я не замечаю ничего, ссылающегося на ошибку):

06-19 17:23:08.876 728-728/com.example.kaczor.tmc_shpreader W/dalvikvm:
Invalid indirect reference 0xbcad9adc in decodeIndirectRef
06-19 17:23:08.876 728-728/com.example.kaczor.tmc_shpreader E/dalvikvm: VM
aborting
06-19 17:23:08.906 728-728/com.example.kaczor.tmc_shpreader A/libc: Fatal
signal 11 (SIGSEGV) at 0xdeadd00d (code=1), thread 728 (r.tmc_shpreader)
[...]

Редактировать:
Определение C ++ SHPObject можно найти по адресу: http://shapelib.maptools.org/shp_api.html

1

Решение

Поэтому я конвертировал double [] в jdoubleArray, не уверен, почему мне не пришлось конвертировать int []. Хотя я обнаружил, что все значения int [] в Java равны 0, я все равно должен его преобразовать.

    jclass shpObjectClass = env->FindClass("com/example/kaczor/tmc_shpreader/Shape/Shapes/SHPObject");
jmethodID shpObjectConstructor = env->GetMethodID(shpObjectClass, "<init>", "(IIIIIII[I[D[D)V");
SHPObject* a = new SHPObject[nEntities];
jobject recognition_result;
jobjectArray shapesToReturn = env->NewObjectArray(nEntities,shpObjectClass,env->NewObject(shpObjectClass,defaultShpObjectConstructor));

for(i = 0; i < nEntities; i++){
a[i] = *SHPReadObject(handle,i);

jdoubleArray padfXARRAY = env->NewDoubleArray(a[i].nVertices);
env->SetDoubleArrayRegion(padfXARRAY, 0, a[i].nVertices, (jdouble *)a[i].padfX );
jdoubleArray padfYARRAY = env->NewDoubleArray(a[i].nVertices);
env->SetDoubleArrayRegion(padfYARRAY, 0, a[i].nVertices, (jdouble *)a[i].padfY );
jdoubleArray panPartStart = env->NewDoubleArray(a[i].nParts);
env->SetDoubleArrayRegion(panPartStart, 0, a[i].nParts, (jdouble *)a[i].panPartStart );

int shapeId = a[i].nShapeId;
int shpType = a[i].nSHPType;
int nParts = a[i].nParts;
int dfXMin = a[i].dfXMin;
int dfXmax = a[i].dfXMax;
int dfYMax = a[i].dfYMax;
int dfYMin = a[i].dfYMin;

recognition_result = env->NewObject(
shpObjectClass, shpObjectConstructor, shapeId,shpType,nParts,dfXMin,dfXmax,dfYMin,dfYMax,panPartStart, padfXARRAY, padfYARRAY);
env->DeleteLocalRef(padfXARRAY);
env->DeleteLocalRef(padfYARRAY);
env->SetObjectArrayElement(shapesToReturn,i,recognition_result);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]