Можете ли вы связать статическую библиотеку непосредственно в приложении Android?

#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, который будет использоваться для вызова собственного кода.