1
我有以下的Java類:的Android,JNI調用Java構造函數C++
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
您是否檢查過C本機類型'double'是否與JNI定義類型'jdouble'的大小相同?請參閱:https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/types.html –
對我來說看起來一樣 –