2

Ich möchte eine C++ - Bibliothek in meiner Android App verwenden. Ich habe versucht, entlang der hello-libs Beispiel von Google NDK Proben zu folgen, aber irgendwie funktioniert es nicht.Verwenden einer vorgefertigten freigegebenen Bibliothek in Android Studio (cmake)

Es scheint, dass meine Bibliothek nicht in die APK gepackt ist. Alle Tutorials, die ich gefunden habe, verwenden *.mk-Dateien, aber ich möchte cmake verwenden.

Das ist mein CMakeLists.txt:

# Sets the minimum version of CMake required to build the native library. 
cmake_minimum_required(VERSION 3.4.1) 

# native lib 
add_library(native-lib SHARED 
      native-lib.cpp) 

set(IMPORT_DIR ${CMAKE_SOURCE_DIR}/../jniLibs) 

# shared lib 
add_library(shared-lib SHARED IMPORTED) 
set_target_properties(shared-lib PROPERTIES IMPORTED_LOCATION 
         ${IMPORT_DIR}/dynamic/lib/${ANDROID_ABI}/libLibrary.so) 
target_include_directories(native-lib PRIVATE 
          ${IMPORT_DIR}/dynamic/include) 

# linking libs 
target_link_libraries(native-lib 
         android 
         shared-lib 
         log) 

Sobald ich die shared-lib zusammen mit den anderen verknüpfen, ich folgende Fehlermeldung erhalten, wenn die App läuft:

E/art: dlopen("/data/app/my.package.name-1/lib/arm/libnative-lib.so", RTLD_LAZY) failed: dlopen failed: library "C:/projects/HelloLibs/app/src/main/cpp/../jniLibs/dynamic/lib/armeabi-v7a/libLibrary.so" not foun 
D/AndroidRuntime: Shutting down VM 
E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: my.package.name, PID: 29266 
        java.lang.UnsatisfiedLinkError: dlopen failed: library "C:/projects/HelloLibs/app/src/main/cpp/../jniLibs/dynamic/lib/armeabi-v7a/libLibrary.so" not found 
         at java.lang.Runtime.loadLibrary(Runtime.java:371) 
         at java.lang.System.loadLibrary(System.java:988) 
         at my.package.name.MainActivity.<clinit>(MainActivity.java:11) 
         at java.lang.reflect.Constructor.newInstance(Native Method) 
         at java.lang.Class.newInstance(Class.java:1690) 
         at android.app.Instrumentation.newActivity(Instrumentation.java:1078) 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2543) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2771) 
         at android.app.ActivityThread.access$900(ActivityThread.java:177) 
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1432) 
         at android.os.Handler.dispatchMessage(Handler.java:102) 
         at android.os.Looper.loop(Looper.java:135) 
         at android.app.ActivityThread.main(ActivityThread.java:5912) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at java.lang.reflect.Method.invoke(Method.java:372) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200) 

Es sieht wie die Bibliothek nicht auf dem Gerät gefunden wird. Sonst sieht es so aus, als wäre der Weg der Bibliothek immer noch der meiner lokalen Maschine.

+0

'dlopen ("/data/app/mein.package.name-1/lib/arm/libnative-lib.so ", RTLD_LAZY)' Haben Sie dieses Verzeichnis erstellt? Sollte es nicht "lib/armeabi-v7a" sein? –

+0

@DanAlbert, nein: Am Gerät sind die gültigen Pfade unter 'lib' ** Arm **, ** Arm64 **, ** x86 **, ** x86_64 **. Frag mich nicht warum. –

Antwort

0

Sie müssen CMake nicht verwenden, um gemeinsam genutzte Bibliotheken (.so-Dateien) zu verwenden. Platzieren Sie die Bibliotheken einfach in den entsprechenden Verzeichnissen im Verzeichnis src/main/jniLibs. Dann können Sie die Bibliotheken direkt laden.

Android Studio zeigt möglicherweise einen Fehler in den nativen Methodendeklarationen, aber Ihre App funktioniert einwandfrei.

+0

Aber wie kann ich die Bibliothek in meinem 'native-lib-cpp' verwenden? Die shared library hat keine jni-Methoden, ich möchte sie in eine zweite Bibliothek schreiben, die in Android Studio geschrieben wurde. – Dario

+0

Sie können target_link_libraries immer noch aus dem jniLibs-Ordner auswählen, indem Sie einfach das Verzeichnis angeben –

1

Der vorgefertigte libLibrary.so hat kein SONAME. Wenn Sie diese Bibliothek aus irgendeinem Grund nicht mit dem neuesten NDK neu erstellen können, können Sie das Dienstprogramm patchelf verwenden, um SONAME zu vorhandenen Binärdateien hinzuzufügen.

Verwandte Themen