Android, импорт внешней библиотеки в NDK

Я делаю приложение 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

Какие-нибудь советы?

0

Решение

Во-первых, начните взламывать пример 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, которую вы хотите использовать, и, хотя она достаточно проста, будут некоторые ошибки.

  • Вам нужно будет реализовать 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
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]