Из-за проблем с безопасностью я хотел бы связать все библиотеки статически, включая мою собственную библиотеку, содержащую функцию JNI_OnLoad. Я читал, что можно связать библиотеку JNI статически (http://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/invocation.html#library_version), но я не могу сделать это с помощью Android Studio. Является ли это возможным?Статическая библиотека Android NDK cmake JNI
Вот что у меня есть.
В Java коде:
System.loadLibrary("testlibrary");
В CMake Makefile:
add_library(testlibrary
STATIC
${mysources})
target_link_libraries(testlibrary)
В файле C++:
extern "C" {
EXPORT
JNIEXPORT jint JNICALL JNI_OnLoad_testlibrary(JavaVM *vm, void *reserved) {
...
return JNI_VERSION_1_8;
}
Когда построен с Android Studio приложения не удается, потому что он пытается найти * .so файл библиотеки:
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/xxx-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libtestlibrary.so"
'target_link_libraries' принимает по меньшей мере 2 аргумента: исполняемый файл/библиотеку и другую библиотеку для связи с ним. В вашем коде вы передаете только один аргумент. – Tsyvarev
Какие проблемы безопасности вы пытаетесь решить, используя статическую библиотеку вместо динамической? Статические библиотеки, во всяком случае, содержат больше информации, чем общий, не менее. –
Я пытаюсь избежать случаев, когда кто-то решает переопределить функции внутри разделяемых библиотек с поддельными из пользовательской библиотеки. – jozols