Wo sucht Delphi / Android nach einer eigenen Sprachbibliothek?

9

Ich möchte Delphi Android-Apps MIDI-Funktionen hinzufügen. MIDI steht über die SoniVox-Bibliothek zur Verfügung, auf die über das Android NDK zugegriffen werden kann. Ein Beispiel für diesen Treiber finden Sie hier . Der Treiber ist in C geschrieben, mit dem NDK ist es möglich, eine eigene Sprachbibliothek zu erstellen, auf die über einen System.loadLibrary-Aufruf zugegriffen werden kann.

%Vor%

Ich habe eine Android-App mit Eclipse erstellt, den MidiDriver als native Bibliothek hinzugefügt und alles eingerichtet. Mit diesem Treiber habe ich MIDI-Funktionen in meiner App. Der Umriss des MidiDriver-Codes finden Sie unten.

%Vor%

Als nächstes habe ich die JNI-Schnittstelle getestet, um zu sehen, ob ich Java-Klassen von Delphi über JNI erreichen könnte. Kein Problem auch nicht. Also theoretisch sollte ich über eine Java-Schnittstelle auf den MidiDriver zugreifen können: cool! Ich habe MidiDriver in eine andere Java-Klasse eingepackt: MIDI_Output, um die Schnittstelle intern zu handhaben (ich habe keine Ahnung, wie man eine Java-Schnittstelle in Delphi einbindet. MIDI_Output erzeugt eine Instanz von MidiDriver und ruft bei Bedarf Funktionen von MidiDriver auf läuft von Eclipse aus. Einige Teile von MIDI_Output unten:

%Vor%

Im obigen Beispiel ruft putShort die Funktion write from MidiDriver auf, die eine in der nativen Bibliothek definierte Funktion ist. Das alles funktioniert gut in Java, aber in der Praxis von Dell ist es etwas schwieriger, wie Sie vielleicht vermutet haben. Um die Aufrufkette detaillierter zu zeigen, muss ich diese ganze Vorrichtung in Delphi verwenden, siehe das Bild unten.

In libsonivox (gefunden in /system/lib ) ist die Funktion EAS_WriteMidiStream zu finden, die aus der Funktion write in libmidi.so (überall gefunden, aber auch in /system/lib und /vendor/lib ) aufgerufen wird Dies wird in MidiDriver.java in MIDI_Output.apk deklariert, was von MIDI_Output.java aufgerufen wird, was ein new MidiDriver erzeugt und sich auf midi_driver.write (...) in der Funktion putShort des gleichen Pakets bezieht. Schließlich sollte putShort in Delphi aufgerufen werden, kommt aber nie dorthin.

Es wird abgebrochen, wenn MIDI_Output den new MidiDriver erstellt, der versucht, die midi -Bibliothek zu laden. Das Programm kann die Bibliothek " midi " nicht laden. Ich habe adb -d logcat ausgeführt, um zu sehen, was passiert und die Ausgabe wird unten angezeigt. Die Fehlermeldung, die auf dem Android-Bildschirm angezeigt wird, ist hervorgehoben.

%Vor%

Ich verstehe, dass die Bibliothek nicht gefunden werden kann. Das Problem ist, ich weiß nicht, wo diese Bibliothek gesucht wird. Die Fehlermeldung erwähnt /vendor/lib und /system/lib . Ich habe libmidi.so diesen Bibliotheken hinzugefügt. Ich habe die Bibliothek zum Anwendungsverzeichnis com.embarcadero.MIDI_Output_Project/lib hinzugefügt (dort speichert android die Bibliothek), in /storage/sdcard0/Data/d/ (das Verzeichnis, in dem MIDI_Output.apk mit den Java-Klassen gespeichert ist). Ich sprengte buchstäblich mein Android-System mit libmidi.so. Ich habe versucht, auch libmidi.so zu laden.

Als Test habe ich dem MIDI_Output-Paket eine sehr einfache Beispielklasse hinzugefügt und die Funktion test_int aufgerufen. Dies läuft ohne Probleme.

%Vor%

Meine Frage ist: In welchem ​​Verzeichnis sucht DalvikVM in einer oben beschriebenen Konfiguration nach nativer Bibliothek (Delphi ruft eine Java-Klasse über JNI auf und Java ruft eine C-Bibliothek über NDK auf)?

Eine zweite Frage: Ist es überhaupt ein Suchpfadproblem? Vielleicht kann Delphi NDK nicht über JNI aufrufen.

Ich habe versucht, so kurz wie möglich zu sein. Wenn jemand denkt, ich sollte mehr Code hinzufügen, lassen Sie es mich wissen. Jede Hilfe wird sehr geschätzt.

    
Arnold 07.01.2014, 21:57
quelle

1 Antwort

1

NDK-Bibliotheken, die von Delphi verwendet werden, sollten in <path to your PlatformSDKs>\android-ndk-r8e\platforms\android-14\arch-arm\usr\lib platziert werden. Ich erkannte das dank der Empfehlungen von Arioch und Chris, das NDK direkt zu nutzen. Die meisten Android-Dateien im Verzeichnis Source\rtl\android enthalten die Datei Androidapi.inc , die die folgenden Definitionen enthält

%Vor%

Das Verzeichnis /usr/lib existiert nicht auf dem Nexus-7, aber ich fand es in dem oben erwähnten Pfad mit allen Dateien, die im const -Teil deklariert wurden. Durch das Kopieren von libmidi.so in dieses Verzeichnis wurde das Problem behoben. Ich habe jetzt das nicht so kleine Problem, keinen Ton zu hören. Ich werde versuchen, das jetzt zu lösen, und versuche auch, das NDK direkt anzurufen.

    
Arnold 08.01.2014 11:45
quelle

Tags und Links