2016-03-24 16 views
1

aufrufen Ich möchte kein Java in meiner kleinen NDK-Anwendung. Ich möchte eine freigegebene .so-Bibliothek laden. Ich möchte LoadLibrary dafür direkt aus C++ mit jni aufrufen. Hat das jemand versucht?wie LoadLibrary für meine .so freigegebene Bibliothek aus C++

BTW Ich habe bereits die .so-Bibliothek in Apk zusammen mit Haupt-.so-Datei verpackt. Bitte beachten Sie auch, dass ich Visual Studio 2015 für Android-Entwicklung verwenden, also keine .mk-Dateien

Antwort

0

Sie müssen loadLibrary (...) nicht aus C++ aufrufen, um eine gemeinsam genutzte Bibliothek zu verwenden. Sie müssen nur darauf verlinken, wenn Sie Ihren C++ Code erstellen.

Werfen Sie einen Blick auf die native-activity example in Google NDK examples. Wenn Sie die neue experimentelle NDK-Unterstützung verwenden möchten, sollten Sie stattdessen auf these examples verweisen.

Update: Für Visual Studio-Benutzer wäre diese tutorial on creating a native-activity hilfreicher.

+0

danke, das wäre eine richtige Sache zu tun. Leider habe ich keinen Zugriff auf android.mk Datei, so dass ich diesen Mechanismus nicht verwenden kann, weil ich Visual Studio 2015 für Android zu entwickeln, und es hat nur eine Reihe von seltsamen XMLs und keine .mk-Dateien (also keine LOCAL_SHARED_LIBRARIES) ... – Yuriv

+0

das ist nur Standard-native Aktivität, die ich bereits habe. Mein Problem, ich bin jetzt nicht in der Lage, Shared .so Bibliothek aus meiner nativen Aktivität zu verwenden. Dieses Tutorial deckt das nicht ab. – Yuriv

+0

Sie müssen herausfinden, wie Visual Studio Abhängigkeiten für NDK-Anwendungen löst. Die Verwendung von loadLibrary (...) ist nur der Schritt, der benötigt wird, um diesen Code von Java zu verwenden, aber in diesen seltsamen XMLs oder einer anderen Konfiguration sollte es eine Abgrenzung von Abhängigkeiten geben. Ich kann dir nicht mehr helfen, da ich VS nicht habe, aber vielleicht gibt dieses Beispiel einige Antworten: https://code.msdn.microsoft.com/TwoLibs-Android-Library-6396e5c4/view/SourceCode #content Viel Glück. –

0

schaffte ich es so nennen Loadlibrary:

*jclass sysClass = (*env)->FindClass(env, "java/lang/System"); 
jmethodID loadLib = (*env)->GetStaticMethodID(env, sysClass, "loadLibrary", "(Ljava/lang/String;)V"); 
jstring jstr1 = (*env)->NewStringUTF(env,"libSharedObject1"); 
(*env)->CallStaticVoidMethod(env, sysClass, loadLib,jstr1);* 

Leider obwohl es später erfolgreich läuft auf sie in keinem Zusammenhang Ort stürzt so iguess meinen Anruf einige Korruption auf der ganzen Linie verursacht. Ich bin auch in der Lage, laden Bibliothek wie folgt:

void * lib_handle = dlopen ("/ Daten/Daten/Android1/lib/libSharedObject1.so", RTLD_LAZY);

Dieser Anruf findet meine Bibliothek leider nicht an diesem Ort. Ohne Pfad finde ich es auch nicht, also bin ich immer noch fest ..