【问题标题】:Android, import external library to NDKAndroid,将外部库导入NDK
【发布时间】:2017-05-16 21:27:21
【问题描述】:

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

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

有什么建议吗?

【问题讨论】:

  • 如果您在其他 C 代码中使用它,只需将其链接到您的 C 代码即可。如果你从 Java 中使用它,你需要用 C 代码和匹配的 Java 函数编写一个 JNI 包装器。

标签: android c++ android-studio android-ndk import-libraries


【解决方案1】:

首先,开始研究 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
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    相关资源
    最近更新 更多