Вы должны связать свою окончательную общую библиотеку, созданную Android NDK, с помощью ndk-build
с общей библиотекой PDF, которую, как вы сказали, уже скомпилировали для архитектуры ARM. (Убедитесь, что это так, иначе библиотека не будет работать на Android!)
Для этого, если, например, у вас есть следующая структура каталогов:
jni
└── libs
└────── my_shared_lib.so
└── Android.mk
└── Application.mk
В файле Android.mk должно быть следующее содержимое:
LOCAL_PATH := $(call my-dir)
# define our prebuilt shared library as a module to the build system
include $(CLEAR_VARS)
LOCAL_MODULE := mysharedlib
LOCAL_SRC_FILES := libs/my_shared_lib.so
include $(PREBUILT_SHARED_LIBRARY)
# The final shared library that will be bundled inside the .apk
include $(CLEAR_VARS)
LOCAL_MODULE := mynativelib
LOCAL_LDLIBS := -landroid -llog
LOCAL_CPPFLAGS := -O0 -g3 -std=c++11 -Wall -Wextra
LOCAL_SHARED_LIBRARIES := mysharedlib
LOCAL_C_INCLUDES := myheader1.h myheader2.h
LOCAL_SRC_FILES := src_file1.cpp src_file2.cpp
include $(BUILD_SHARED_LIBRARY)
и содержимое файла Application.mk (для использования стандартной библиотеки C++ и создания окончательной общей библиотеки для двух разных версий архитектуры ARM):
APP_OPTIM := debug
APP_PLATFORM := android-14
APP_STL := gnustl_static
APP_ABI := armeabi armeabi-v7a
Затем, после того как вы скомпилируете свой код из Eclipse или из командной строки с помощью сценария ndk-build, он скомпилирует вашу окончательную общую библиотеку и свяжет ее с вашей предварительно созданной общей библиотекой (т. е. с общей библиотекой PDF, которую вы сказал, что вы пытаетесь использовать).
Для общих библиотек APK-файл, созданный и развернутый на устройстве/эмуляторе, содержит окончательную общую библиотеку, а также все предварительно созданные общие библиотеки, с которыми вы связаны, в отличие от связывания со статическими библиотеками, которые не связаны внутри апк.
В вашем случае у вас должно быть две общие библиотеки в каталоге lib вашего приложения Android после того, как apk будет распакован на устройстве. Вы можете проверить это, выполнив следующую команду из терминала:
adb shell ls -l /data/data/com.company.myapp/lib
Замените com.company.myapp именем пакета вашего приложения.
Кроме того, не забудьте поместить следующее в статический контекст класса Java:
class MyClass
{
static
{
try
{
System.loadLibrary("mynativelib");
}
catch (UnsatisfiedLinkError ule)
{
Log.e(TAG, "WARNING: Could not load native library: "
+ ule.getMessage());
}
}
// other code here...
}
Обратите внимание на использование того же имени внутри вызова метода System.loadLibrary в качестве конечного имени общей библиотеки.
person
Alex Bitek
schedule
29.01.2013