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.
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.
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
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.
Tags und Links java delphi android-ndk jni