Android,将外部库导入NDK
我正在使用NDK在Android上制作一个Android Shapefile reader应用程序。我想用C++来解析形状文件。我找到了“Shapefile C库”。Github: 我正在使用Android studio,不知道如何将其导入到我的Android项目中,以便可以使用中描述的功能:Android,将外部库导入NDK,android,c++,android-studio,android-ndk,import-libraries,Android,C++,Android Studio,Android Ndk,Import Libraries,我正在使用NDK在Android上制作一个Android Shapefile reader应用程序。我想用C++来解析形状文件。我找到了“Shapefile C库”。Github: 我正在使用Android studio,不知道如何将其导入到我的Android项目中,以便可以使用中描述的功能: 有什么建议吗?首先,从谷歌开始破解Hello JNI示例: 将其用作试验台 然后,创建一个带有public native方法的Java类,该类允许您与库交互。某种高级API,可能是将文件名或缓冲区传递给
有什么建议吗?首先,从谷歌开始破解Hello JNI示例: 将其用作试验台 然后,创建一个带有
public native
方法的Java类,该类允许您与库交互。某种高级API,可能是将文件名或缓冲区传递给SHOpenLL并返回指向ShapeFile上下文的指针(ShapeHandle
)。看起来您的库是用C编写的,因此您应该能够编写一个类似的接口来查询通过ShapeHandle
指针的(jint)C样式转换的shapefile
接下来,您需要使用javah
为shapefile接口生成标题。生成标头后,您可以使用它在.cc文件中实现接口。从那里,您将基本上对您的C接口进行Java调用,它将返回jobjects。(jint、jbool、jstring等)
我在看你想要使用的ShapeLib,虽然它很简单,但会有一些问题
- 您需要实现文件I/O。我建议看一个如何访问APK文件(或下载文件)的示例。您需要使用activity.context.assetmanager初始化它。然后使用nv_文件包装FRead/FSeek/etc
- 将信息传递回java将非常困难。就我个人而言,我会构建一个Java类来保存形状信息,并在
端填充它。但是,您可能会试图从C
一次查询一个参数。会很慢,但不太容易出错SHPObject
如果您在其他C代码中使用它,它只需要链接到您的C代码。如果您是从Java使用它,则需要用C代码编写JNI包装器并匹配Java函数。
// 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
}