Я делаю приложение Android Shapefile Reader на Android с использованием NDK. Я хочу использовать C ++ для разбора файлов форм. Я нашел библиотеку «Shapefile C Library». Github: https://github.com/sw897/shapelib.
Я использую Android studio и не знаю, как импортировать его в мой проект Android, чтобы использовать функции, описанные в: http://shapelib.maptools.org/shp_api.html
Какие-нибудь советы?
Во-первых, начните взламывать пример Hello-JNI от Google:
https://github.com/googlesamples/android-ndk/tree/master/hello-jni
Используйте это как испытательный стенд.
Затем создайте класс Java с public native
методы, которые позволяют вам взаимодействовать с вашей библиотекой. Что-то вроде высокоуровневого API, возможно, для передачи имени файла или буфера в SHPOpenLL и возврата указателя на контекст ShapeFile (ShapeHandle
). Похоже, ваша библиотека написана на C, поэтому вы должны иметь возможность написать аналогичный интерфейс для запроса шейп-файла, передавая (jint) приведение в стиле c вашего ShapeHandle
указатель.
Далее вам нужно поиграть с javah
создать заголовок для вашего интерфейса шейп-файла. После того, как заголовок сгенерирован, вы можете использовать его для реализации вашего интерфейса в файле .cc. Оттуда вы будете в основном делать вызовы Java к вашему интерфейсу C, и он будет возвращать рабочие места. (jint, jbool, jstring и т. д.)
Я смотрю на ShapeLib, которую вы хотите использовать, и, хотя она достаточно проста, будут некоторые ошибки.
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
}
Других решений пока нет …