Перемещение собственных библиотек из приложения Android в системную библиотеку и доступ к ней из приложения

#android #android-ndk #java-native-interface #root #native-code

#Android #android-ndk #java-native-interface #root #собственный код

Вопрос:

Я скомпилировал один собственный код с Android ndk. Теперь вместо того, чтобы сохранять эту библиотеку как часть .apk, я хочу установить ее в системе Android (system / lib64) и загрузить приложение из системы. Я перенес библиотеку в system / lib64 и удалил библиотеки из папки lib приложения Android. Но когда я пытаюсь запустить, я получаю

 "java.lang.UnsatisfiedLinkError: dlopen failed: library "something.so" not found"
  

Ниже приведен мой makefile

 LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := eng
LOCAL_C_INCLUDES  = $(LOCAL_PATH) $(LOCAL_PATH)/Include
LOCAL_SRC_FILES := ABCProtocol/ABCProtocol.c ABCProtocol/DatalinkLayer.c ABCProtocol/PhysicalLayer.c
LOCAL_MODULE := libABCXYZProtocol
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := eng
LOCAL_C_INCLUDES  = $(LOCAL_PATH) $(LOCAL_PATH)/$(KERNEL_DIR)/include $(LOCAL_PATH)/Include $(LOCAL_PATH)/Util $(LOCAL_PATH)/Include/Linux/XYZ $(LOCAL_PATH)/ABCProtocol
LOCAL_SRC_FILES := Linux/XYZ/ABCXYZLinux.c Util/Util.c Util/Logger.c
#LOCAL_CFLAGS  = -Wno-error=format-security
LOCAL_CFLAGS  = -w
LOCAL_MODULE := libABCXYZWrapper
LOCAL_SHARED_LIBRARIES :=libABCXYZProtocol
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS) 
LOCAL_MODULE_TAGS := eng
LOCAL_MODULE:=com_example_reader_ABCXYZappnote_NativeLibrary
LOCAL_SRC_FILES:=com_example_reader_ABCXYZappnote_NativeLibrary.c
LOCAL_C_INCLUDES  = $(LOCAL_PATH) $(LOCAL_PATH)/$(KERNEL_DIR)/include $(LOCAL_PATH)/Include $(LOCAL_PATH)/Util $(LOCAL_PATH)/Include/Linux/XYZ
#LOCAL_CFLAGS  = -DANDROID
LOCAL_SHARED_LIBRARIES:=libc libABCXYZWrapper libABCXYZProtocol
include $(BUILD_SHARED_LIBRARY)
  

Комментарии:

1. Можете ли вы поделиться кодом своего makefile (Android.mk )? Эта проблема возникает, когда вы не нажимаете зависимые библиотеки. В таких случаях происходит сбой связывания.

2. Также заново создайте и установите приложение после удаления библиотеки. Если зависимостей нет, и вы все еще видите ошибку, возможно, вам придется снова создать библиотеку, поместив ее в исходный код Android и используя команду mm.

3. Я вручную перенес библиотеки в lib64. Я вижу там библиотеки. Должен ли я предоставить System.LoadLibrary(«system/ lib64/smthng.so»);?

4. можете ли вы поделиться исходным кодом makefile? Makefile, который вы использовали для создания libsomething.so . Это поможет мне понять, что такое ваша библиотека и имеет ли она какие-либо зависимости.. является libsomething. итак, основная библиотека, которую пытается использовать ваше приложение, или это зависимая библиотека какой-либо другой библиотеки..

5. libABCXYZProtocol, libABCXYZWrapper — это те, которые я поместил в папку lib64 в системе и удалил из кода Android. Y — это простая компиляция NDK. Последний на самом деле является кодом JNI.

Ответ №1:

Приложениям не разрешается получать доступ к закрытым API-интерфейсам из системных библиотек: https://developer.android.com/about/versions/nougat/android-7.0-changes.html#ndk . Библиотеки, используемые вашим приложением, должны быть упакованы вместе с вашим приложением.

Почему вы все равно хотите поместить их в /system/lib?

Комментарии:

1. Я пытаюсь сделать это с помощью Android 6.0 SDK, и мое целевое устройство также 6.0. Я хочу это сделать, потому что у меня есть некоторые операции (доступ к оборудованию) в собственной библиотеке, которые не будут работать, если я упакую APK. Я думал, что это сработает, если я использую библиотеку из system / lib

2. Однако вы не сможете отправить это приложение. Вы не можете изменить раздел своих пользователей / system.

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

4. Тогда NDK — это не то, что вы ищете. Вы захотите взглянуть на процесс сборки AOSP и фактически написать системную библиотеку и сделать ее частью образа системы, а не использовать NDK. Приложения могут загружать расширения, зависящие от поставщика, через dlopen (хотя я не уверен, как это работает в версии 7.0 и новее).