2017-05-16 18 views
0

私はAndroidでNDKを使用してAndroid Shapefileリーダーアプリを作成しています。私はC + +を使用してシェイプファイルを解析したい。ライブラリ "Shapefile C Library"が見つかりました。 Github:https://github.com/sw897/shapelibhttp://shapelib.maptools.org/shp_api.htmlAndroid、NDKに外部ライブラリをインポート

任意のヒント:

私はどのように私はで説明した機能を使用することができ、私のAndroidのプロジェクトにインポートするには考えているAndroidのスタジオを使用していないとしていますか?

+0

他のCコードで使用している場合は、Cコードにリンクする必要があります。 Javaから使用している場合は、JNIラッパーをCコードで記述し、対応するJava関数を記述する必要があります。 –

答えて

1

まず、グーグルから離れこんにちは、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 
} 
関連する問題