Android,导入外部库到NDK

Android, import external library to NDK

我正在使用 NDK 在 Android 上制作 Android Shapefile reader 应用程序。我想使用 C++ 来解析形状文件。我找到了图书馆 "Shapefile C Library"。 Github: https://github.com/sw897/shapelib.

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

中描述的功能

有什么建议吗?

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

将其用作试验台。

然后,使用 public native 方法创建 Java Class,让您与您的图书馆互动。一些高级 API,可能是将文件名或缓冲区传递给 SHPOpenLL 和 return 指向 ShapeFile 上下文的指针 (ShapeHandle)。看起来您的库是用 C 语言编写的,因此您应该能够编写一个类似的界面来查询通过 ShapeHandle 指针的 (jint) c-style 转换的 shapefile。

接下来,您需要尝试使用 javah 为您的 shapefile 界面生成 header。生成 header 后,您可以使用它在 .cc 文件中实现您的界面。从那里你基本上会 Java 调用你的 C 接口,它会 return jobjects。 (jint、jbool、jstring 等...)


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

  • 您需要实施 SAHooks for file I/O. I suggest looking at NVFile 以获取如何访问 APK 文件(或下载的文件)的示例。您将需要使用 activity.context.assetmanager 初始化它。然后用nv_file包裹FRead/FSeek/etc...
  • 将信息传回 java 会很困难。就个人而言,我会构建一个 Java class 来保存形状信息并在 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://whosebug.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://whosebug.com/a/36759159/7949696
}