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
Cネイティブタイプの「double」がJNI定義タイプの「jdouble」と同じサイズかどうかを確認しましたか?参照:https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/types.html –
同じように見えます –