Ich habe bereits Arm android Shared Library (libtest.so) gebaut. Ich bin daran interessiert, eine Funktion wiederzuverwenden (die nicht viele Abhängigkeiten hat - sie erstellt nur eine Klasseninstanz und ruft zwei Methoden auf). Ich möchte diese Funktion aufrufen (es dauert ein Argument std :: string) und erhalten zurückgegebenen Wert.
Ist es möglich, so etwas zu tun? Ich habe keine Header-Dateien.
Ich habe versucht, diese Android.mk, ich libttest.so in /jni
und /libs/armeabi
, /lib/armeabi
. An diesem Punkt kompiliert meine cpp
-Datei, aber was nun? Wenn es möglich ist, wie kann ich Funktion von libtest.so aufrufen? Ich kenne seinen Namen von objdump
Bearbeiten:
Ich habe versucht, prebuild Bibliothek von hallo-jni Probe mit diesem android.mk hinzuzufügen:
%Vor% Und es hat funktioniert, aber der gleiche Code für libtest.so
zeigt den folgenden Fehler (beim Start)
libtest.so ist im Ordner (auf dem Gerät unter /data/data/[package]/lib
) neben libhello-jni.so vorhanden. Was kann falsch sein?
Ich habe eine Anwendung, wo ich etwas ähnliches wie Sie (oder vielleicht genau das, was Sie brauchen) tun.
Ich habe Bibliotheken in Form von * .so-Dateien vorkompiliert. (z.B. lib1.so, lib2.so usw.), die mit einigen Überschriften kommen.
Ich habe ein Modul erstellt, das die vorkompilierten Bibliotheken nutzt, indem es ihre Header und die * .so-Dateien einfügt. In dem Beispiel habe ich es 'libtestwrapper' genannt. Das Modul definiert seine eigenen Quelldateien und beinhaltet optional. Die Modulfunktionalität kann für ein zweites Modul exportiert werden (wenn Sie Header-Dateien bereitstellen), wie später erklärt.
Ich habe ein zweites Modul (newModule) erstellt, das das erste (libtestwrapper) verwendet, indem es zu "LOCAL_SHARED_LIBRARIES" hinzugefügt wird. Dadurch werden Ihre zuvor exportierten Headerdateien (in 'libtestwrapper') für 'newModule' verfügbar.
Hier ist der Inhalt meiner Android.mk:
%Vor%Wenn die Bibliothek nicht mit den Android-Build-Tools (d. h. NDK) erstellt wurde, wird sie wahrscheinlich keinen kompatiblen ABI haben. Selbst wenn es unter Verwendung einer ARMv5 EABI-kompatiblen Version von gcc erstellt wurde, wird es fehlschlagen, wenn es von einer beliebigen libc / libc ++ abhängt. Die bionische C-Bibliothek ist nicht binärkompatibel mit anderen C / C ++ - Bibliotheken, und Sie müssen selbst für eine gemeinsame Bibliothek nativen Code erstellen.
Wenn Sie eine C ++ - Methode von Java aufrufen und Typen wie "string" übergeben möchten, sollten Sie einen Conversion-Layer mit JNI (Java Native Interface) schreiben.
Sie finden vielleicht mehrere Tutorials, wie dies im Internet gemacht wird. Ein Beispiel hier
Als Zusammenfassung
1- Deklarieren Sie eine native Methode in Java
2- Generieren Sie die Signatur, die aus Ihrer C ++ - Bibliothek exportiert werden soll, die aufgerufen wird, wenn diese Methode in Java aufgerufen wird.
Beispielbefehl: javah com.companyname.JavaTestCaller
Dieser Befehl erzeugt eine Header-Datei mit der entsprechenden Signatur.
3- Bereiten Sie eine C ++ - Bibliothek vor, die diese Methode enthält. Tun Sie, was Sie wollen in dieser Methode (Anrufe in libtest.so wenn Sie wollen) und geben Sie das Ergebnis zurück. Verwenden Sie Methoden von, wenn Typenkonvertierungen erforderlich sind.
4- Legen Sie diese neue Bibliothek neben Ihrer libtest.so in Ihrer Anwendung. Laden Sie diese Bibliothek nach libtest.so.
5- Rufen Sie die native Java-Methode aus Ihrer Anwendung auf.
Haben Sie versucht, diese Zeile zu ändern:
%Vor%zu:
%Vor%lib und .so werden automatisch verwendet, um den Namen der gemeinsam genutzten Bibliothek aufzulösen. Sie sollten auch in der Lage sein zu verwenden:
%Vor%PREBUILT_SHARED_LIBRARY ist eine weitere Option.
Da Sie keine Headerdatei haben, müssen Sie möglicherweise eine gemeinsam genutzte Bibliothek schreiben, mit der Sie die vordefinierte Bibliothek aufrufen. Ihre App ruft die neue gemeinsam genutzte Bibliothek auf, die die korrekten Namen von JNI-Symbolen exportiert, und die neue gemeinsam genutzte Bibliothek ruft die Funktion md5 () auf.
Tags und Links android c++ shared-libraries