Вызов .SO функций из Java-класса с использованием JNI - PullRequest
0 голосов
/ 20 марта 2019

Я знаю, что это может показаться странным, но сейчас у меня есть .SO (Shared Object in C), и я должен использовать его в своем проекте Android.

Теперь мое требование - вызывать функции, которые находятся в .SO, непосредственно в Java, создавая оболочку JNI для заголовков в .SO.

Мой вопрос в том, что я принимаю за поток,

1.Создайте собственные методы JNI -> затем создайте файл заголовка, а затем -> создайте реализацию этих методов из файла заголовка, включите файлы .h из .SO в локальную реализацию и вызовите методы, представленные в .SO

или

  1. Непосредственно Создайте собственные методы JNI для файлов заголовков, представленных в .SO, которые будут вызывать методы C напрямую.

или

  1. Есть ли у нас другой подход?

Пожалуйста, поправьте меня, если я что-то упустил.

Я сослался на некоторый онлайн-контент, и могу сказать, что все приведенные ниже примеры совершенно отличаются от того, что мне нужно.

https://www.codepool.biz/package-jni-shared-library-jar-file.html

https://www.codepool.biz/build-so-aar-android-studio.html

https://dzone.com/articles/generating-executable-jar-file

https://www.ibm.com/developerworks/java/tutorials/j-jni/j-jni.html

Как использовать c lib (.so) с Android?

1 Ответ

1 голос
/ 20 марта 2019

Обычно у вас есть:

  • lib.so - черный ящик
  • lib.h - Заголовочные файлы библиотеки, представляющие некоторые методы lib.so. Это доступные вам методы.
  • jni.cpp и jni.h файлы - этот код является мостом между Java и библиотекой lib. Здесь вы импортируете заголовочный файл lib.h. Таким образом, вы получаете вызов со стороны Java, взаимодействуете с методом lib.so и отправляете результат обратно на сторону Java.

В конце концов, у вас должен быть код JNI, который будет ответственен за взаимодействие как со стороны java, так и со стороны lib. Эта реализация может быть очень простой, например, вызывать метод lib и возвращать результат, или она может быть более сложной, например, запускать поток, ждать результата, а затем сообщать о завершении и т. Д. С более сложными классами и т. Д.

В любом случае ваш код JNI (будь то отдельный метод или более сложный класс) должен включать заголовочные файлы lib.h, чтобы можно было вызывать lib.so методы.

...