安卓,将外部库导入 NDK

Android, import external library to NDK

本文关键字:导入 NDK 外部 安卓      更新时间:2023-10-16

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

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

有什么提示吗?

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

将其用作试验台。

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

接下来,您需要使用javah来生成 shapefile 界面的标题。 生成标头后,可以使用它来在 .cc 文件中实现接口。 从那里你基本上会对你的 C 接口进行 Java 调用,它会返回 jobjects。(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
}