Я пытаюсь добавить в приложение собственный код C++, но при выполнении получаю ошибку компоновщика. Я предполагаю, что где-то в моих файлах Android.mk есть проблема, или, может быть, мне следует просто вручную переместить общую библиотеку? Я создаю AOSP на ветке android11-release.
Я добавил следующее в основной файл Android.mk для приложения кухонной мойки вокруг существующего include $(BUILD_PACKAGE):
LOCAL_JNI_SHARED_LIBRARIES := libjni_mylib
include $(BUILD_PACKAGE)
include $(call all-makefiles-under, $(LOCAL_PATH))
Я добавил каталог jni с моим исходным кодом C++ внутри, а также следующий Android.mk:
LOCAL_PATH:= $(call my-dir)
# MyLib
include $(CLEAR_VARS)
LOCAL_CPP_EXTENSION := .cpp
LOCAL_SDK_VERSION := 17
LOCAL_MODULE := libjni_mylib
LOCAL_SRC_FILES := MyJniClient.cpp MyCode.cpp
LOCAL_PRODUCT_MODULE := true
LOCAL_CFLAGS += -ffast-math -O3 -funroll-loops
LOCAL_CFLAGS += -Wall -Wextra -Werror
LOCAL_ARM_MODE := arm
include $(BUILD_SHARED_LIBRARY)
Когда я запускаю приложение и оно выполняет функцию JNI, оно вылетает с этой ошибкой:
E AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: library "libjni_mylib.so" not found
Однако я вижу в цели (которая является эмулятором), что /system/priv-app/MyKitchenSinkApp содержит MyKitchenSinkApp.apk и lib/x86_64/libjni_mylib.so. Почему компоновщик не может найти файл общего объекта? Есть ли еще какая-либо информация, которой я должен поделиться, чтобы помочь?
Обновлено: я обнаружил, что libjni_mylib.so на самом деле является просто символической ссылкой на /system/lib64/libjni_mylib.so, которой не существует. Теперь я не знаю, как это исправить. Похоже, что когда я это делаю make, файл .so на самом деле не создается, даже если файл makefile достигнут.
Оказывается, у меня была опечатка в имени файла в make-файле.
Вы встраиваете раздел продуктов? здесь для LOCAL_PRODUCT_MODULE установлено значение true