Android,将外部库导入NDK

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,可能是将文件名或缓冲区传递给

我正在使用NDK在Android上制作一个Android Shapefile reader应用程序。我想用C++来解析形状文件。我找到了“Shapefile C库”。Github:

我正在使用Android studio,不知道如何将其导入到我的Android项目中,以便可以使用中描述的功能:


有什么建议吗?

首先,从谷歌开始破解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
}