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
}
我正在使用 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
}