まず、グーグルから離れこんにちは、JNIの例でハッキングを開始: https://github.com/googlesamples/android-ndk/tree/master/hello-jni
を使用しているテストベッドとして。
次に、ライブラリとやりとりできるようにするpublic native
メソッドを持つJavaクラスを作成します。高レベルのAPIの何か、おそらくSHPOpenLLにファイル名やバッファを渡し、ShapeFileコンテキストへのポインタを返します(ShapeHandle
)。あなたのライブラリがC言語で書かれているように見えるので、シェイプファイルを照会するための同様のインターフェースを書くことができます。ShapeHandle
ポインタの(jint)Cスタイルのキャストを渡します。
次に、シェイプファイルインターフェイスのヘッダーを生成するには、javah
で遊ぶ必要があります。ヘッダーが生成されたら、それを使用してインターフェイスを.ccファイルに実装できます。そこから、基本的にCインターフェースへのJava呼び出しが行われ、jobjectが返されます。 (JINT、jbool、JSTRING、等...)
私はあなたが使用したいと、それは十分に簡単ですが、いくつかの落とし穴があるだろうということでshapelibで探しています。
- ファイルI/OにはSAHooksを実装する必要があります。私はNVFileを見て、APKファイル(またはダウンロードしたファイル)へのアクセス方法の例を提案します。 activity.context.assetmanagerを使用してinitを初期化する必要があります。次に、nv_fileを使ってFRead/FSeek/etcをラップします。
- Javaに情報を渡すのは厳しいでしょう。個人的には、シェイプ情報を保持するJavaクラスを構築し、
C
側に記入します。しかし、一度に1つずつSHPObject
からこれらのパラメータをクエリしたくなるかもしれません。遅くなりますが、エラーが起こりにくいでしょう。
など。
// Java
MyJavaShapeObject obj = new MyJavaShapeObject();
_c_retrieveShapeObj((jint)pShapeFile, obj);
// C
java_blah_blah_c_retrieveShapeObj(JNIEnv* env, jclass activity, jint theShapeFile, jobject theObj){
ShapeHandle pShapeFileHandle = (ShapeHandle)theShapeFile; // c style conversion
// http://stackoverflow.com/questions/11647646/how-to-use-the-jni-to-change-the-fields-of-a-java-class
// http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#wp16613
// http://stackoverflow.com/a/36759159/7949696
}
他のCコードで使用している場合は、Cコードにリンクする必要があります。 Javaから使用している場合は、JNIラッパーをCコードで記述し、対応するJava関数を記述する必要があります。 –