#android #c #static-libraries
#Android #c #статические библиотеки
Вопрос:
Извините, может быть, это глупо, о чем я спрашиваю, но у меня есть вопрос о связывании статических / разделяемых библиотек в Android.
Я создаю новый проект C Native Android Studio. После сборки я открываю файл apk, и внутри lib
папки размещаются библиотеки libnative-lib.so
для каждого ABI. Размер APK составляет 3.580 КБ.
Но если я изменюсь внутри CMakeLists.txt
, чтобы создать собственную библиотеку, такую как статическая библиотека, так что теперь я получил это:
add_library(native-lib
STATIC
native-lib.cpp)
Когда APK собран, я не могу найти статическую библиотеку (libnative-lib.a). В apk нет lib
папки. Кроме того, размер составляет 2.836 КБ.
Может кто-нибудь, пожалуйста, объясните (или дайте мне ссылку для получения дополнительной информации об этом), где находится библиотека, размещенная в СТАТИЧЕСКОЙ сборке?
И при запуске я получил ошибку, если я связываю статическую:
No implementation found for java.lang.String com.example.myapplication.MainActivity.stringFromJNI()
Комментарии:
1. статическая связь означает, что источники статических библиотек связаны внутри двоичного файла вместе с источниками других двоичных файлов
2. @user1056837 спасибо за комментарий, но почему, когда он связан статически, я запускаю приложение, и я получил ошибку
No implementation found for java.lang.String com.example.myapplication.MainActivity.stringFromJNI()
, но она есть в native-lib.cpp досье. Похоже, он не может найти статическую библиотеку?3. Все, что я могу вам предложить: прочитайте об общих и статических библиотеках в unix, например google.com/search ? q = shared static libraries unix Я считаю, что это должно помочь вам немного прояснить это.
4. Я нашел кое-что, что статические библиотеки не могут быть связаны в приложении Android напрямую, как я пытался, но я не могу найти источник.
5. Я не уверен в том, что вы написали. Как я уже говорил ранее, любая статическая библиотека — это просто набор объектных файлов. Если вы свяжете ее, вы просто свяжете ее объектные файлы с вашим main.o и другими объектными файлами (если таковые имеются). Пожалуйста, попробуйте найти в документации эту часть о jni-оболочках функций c .
Ответ №1:
Вы не можете использовать собственные статические библиотеки непосредственно в приложениях Android.
Пользовательское пространство Android — это, по сути, Java (или, точнее, виртуальная машина Dalvik). Таким образом, все пользовательские приложения должны быть написаны на Java или Kotlin (которые оба компилируются в байт-код Dalvik).
Для использования статические библиотеки C / C должны быть связаны с исполняемым файлом C / C или динамической библиотекой. Они не могут быть загружены непосредственно Linux или Android.
Поскольку в приложении Android нет исполняемого файла C / C , единственный способ использовать статическую библиотеку с приложением Android — это связать ее с динамической библиотекой (* .so), которую можно загрузить через собственный интерфейс Java.
Поскольку JNI использует системный загрузчик для загрузки библиотеки, он может загружать только динамические библиотеки, и из них только те, которые экспортируют функции с соответствующими соглашениями об именовании, чтобы их можно было сопоставить с классом Java, который будет использоваться для вызова собственного кода.