2017-06-19 25 views
1

私はJavaクラスを次ていますアンドロイド、JNI呼び出し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

+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); 
    } 
関連する問題