Android-Assets, C, JNI

8

Wie greifen Sie von C mit dem JNI auf ein Android-Asset, z. B. eine TXT-Datei, zu?

Ich versuche "file: ///android_asset/myFile.txt" und lokal "myFile.txt" mit einem Duplikat von myFile.txt im jni-Ordner mit der C-Implementierungsdatei.

    
SK9 24.01.2011, 08:26
quelle

2 Antworten

11

Die Sache mit Assets ist, dass Sie nicht direkt als Dateien auf sie zugreifen können. Dies liegt daran, dass die Assets direkt vom APK gelesen werden. Sie werden bei der Installation nicht in einen bestimmten Ordner entpackt.

Ab Android 2.3 gibt es eine C-API für den Zugriff auf Assets. Sehen Sie sich <android/asset_manager.h> und das assetManager -Feld in <android/native_activity.h> an. Ich habe dies jedoch noch nie verwendet und bin mir nicht sicher, ob Sie diese Asset-Manager-API verwenden können, wenn Sie sich nicht auf eine native Aktivität verlassen. Und das funktioniert unter Android 2.2 und niedriger sowieso nicht.

So sehe ich drei Optionen:

  • Sie könnten die Assets in ein Verzeichnis extrahieren, aber das wird zusätzlichen Platz beanspruchen
  • du könntest (und bündle) etwas wie libzip verwenden, um die Assets aus dem APK in reinem C zu lesen.
  • oder, um die Bündelung einer zusätzlichen Bibliothek zu vermeiden, ist es meine persönliche Vorliebe, Daten in C mit JNI aus dem Java InputStream -Objekt zu lesen, das von AssetManager.open() zurückgegeben wird. Es braucht ein wenig Code, aber es funktioniert großartig.
olivierg 24.01.2011, 09:03
quelle
2

Wenn Sie die AssetManager C-API nicht verwenden können, weil Sie eine C / C ++ - Bibliothek aufrufen müssen, die einen Dateinamen erfordert, kann stattdessen eine unformatierte Ressource verwendet werden.

Der einzige Nachteil ist, dass er zur Laufzeit in das Datenverzeichnis (app) Ihrer App kopiert werden muss.

Platzieren Sie die Datei in res / root

Platzieren Sie die Datei, die Sie lesen möchten, aus dem systemeigenen Code in res/raw dir.

Erstellen Sie eine Kopie

Kopieren Sie zur Laufzeit die Datei von res/raw/myfile.xml in das data Verzeichnis:

%Vor%

Nun ist der Dateiname, der an Ihren nativen Code übergeben werden soll, myFile.getAbsolutePath()

copyResource (rsrcId, dstFile)

%Vor%     
Brent Faust 25.06.2014 21:49
quelle

Tags und Links