2017-06-19 113 views
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

+0

您是否檢查過C本機類型'double'是否與JNI定義類型'jdouble'的大小相同?請參閱:https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/types.html –

+0

對我來說看起來一樣 –

回答

1

所以我已經將double []轉換爲jdoubleArray,不知道爲什麼我不必轉換int []。雖然我發現Java中int []的所有值都是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); 
    }