1

我正在使用 NDK 在 Android 上制作 Android Shapefile 阅读器应用程序。我想使用 C++ 来解析形状文件。我找到了库“Shapefile C 库”。Github:https ://github.com/sw897/shapelib 。

我正在使用 Android Studio,不知道如何将其导入我的 Android 项目,因此我可以使用以下描述的函数:http ://shapelib.maptools.org/shp_api.html

有小费吗?

4

1 回答 1

2

首先,开始研究 Google 的 Hello-JNI 示例: https ://github.com/googlesamples/android-ndk/tree/master/hello-jni

将其用作测试平台。

public native然后,使用允许您与库交互的方法创建一个 Java 类。某种高级 API,可能将文件名或缓冲区传递给 SHPOpenLL 并返回指向 ShapeFile 上下文 ( ShapeHandle) 的指针。看起来您的库是用 C 编写的,因此您应该能够编写一个类似的接口来查询 shapefile,传递ShapeHandle指针的(jint)c 样式转换。

接下来,您需要尝试javah为您的 shapefile 界面生成标题。生成标头后,您可以使用它在 .cc 文件中实现您的接口。从那里你基本上会对你的 C 接口进行 Java 调用,它会返回作业对象。(jint、jbool、jstring 等...)


我正在查看您要使用的 ShapeLib,虽然它很简单,但会有一些问题。

  • 您将需要为文件 I/O实现SAHooks 。我建议查看NVFile以获取如何访问 APK 文件(或下载的文件)的示例。您将需要使用 activity.context.assetmanager 对其进行初始化。然后使用 nv_file 来包装 FRead/FSeek/etc...
  • 将信息传递回 java 将是困难的。就个人而言,我会构建一个 Java 类来保存形状信息并在旁边填写C。但是,您可能想一次从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
} 
于 2017-05-18T13:33:25.350 回答