Die Beschaffung der name einer Android-APK mit C++ und der NativeActivity-Klasse
Ich Schreibe eine Android-app mit dem NDK und NativeActivity. Meine app hängt von ein paar bits von third-party-code ausgeliefert werden als Vermögenswerte. Momentan bin ich dabei, zu versuchen, diese zu extrahieren Vermögen, während die Ordner-Struktur intakt.
Habe ich versucht, mit dem AssetManager, sondern halten die Ordner-Struktur intakt, es schien, es würde eine riesige Menge von code beteiligt sind, für eine einfache Aufgabe wie das, was ich erwähnt habe. Ich hab da eingeschaltet konzentrieren zu versuchen, die Behandlung der APK als ZIP-Datei und entpacken Sie Ihren Inhalt auf diese Weise. Aber das erfordert, dass ich den genauen Pfad zum APK.
In eine normale Android-app würde man mit getPackageCodePath, aber dies ist eine abstrakte Methode angebracht, um die Kontext-Klasse. Meine Frage ist, wie bekomme ich den genauen Pfad zum APK wenn Sie nicht mit einer normalen Aktivität?
Auch ich habe versucht, den Aufruf getPackageCodePath über JNI, aber das stürzte die app auf dem Konto, nicht in der Lage zu finden, die Methode.
BEARBEITEN:
Ist das überhaupt möglich?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich war tatsächlich in der Lage zu nennen
getPackageCodePath
via JNI und bekommen es zu arbeiten. Der folgende code, der an der Spitze derandroid_main
im native-Aktivität der Probe in NDK r7 Protokolle der richtige Weg und nicht Abstürzen:Ich das Gefühl, könnte dies eine großartige Lösung, wenn. Es gibt zwei Dinge, die sich mit mir Gedanken machen:
env
MitgliedANativeActivity
in der Haupt-Java-thread, und wenn ich das richtig verstanden habe, ist dieser code wird in der ursprünglichen Aktivität thread.ANativeActivity
'sclazz
Mitglied zu sein scheint irreführend und ist eigentlich die Instanz der Java -NativeActivity
statt von der Klasse object. Ansonsten ist dieser code nicht funktionieren würde. Ich hasse es sich auf etwas, das ist offensichtlich irreführend, wie dieses.Abgesehen davon, dass es funktioniert, und ich bin eigentlich rund um ihn selbst zu benutzen, um zu versuchen, zu extrahieren, die auf Ressourcen außerhalb der .apk mit libzip und in das data-Verzeichnis.
Call
getPackageCodePath()
in Java und pass jstring zu Ihrem C++ - app, die über native MethodeDa hatte ich nur die Suche nach genau, wie der attach - /detach-Anrufe werde ich fügen Sie die aktualisierte version hier.
Den folgenden scheint die richtige Stelle, ohne abzustürzen (nach minimaler Test)
Hatte zu ändern, um dies im Jahr 2014.
Haben Sie versucht, zu Lesen /proc/self/cmdline aus Ihrer Anwendung?
Sie sollten in der Lage sein, um es zu öffnen wie ein normales (soweit proc-Dateien sind normal 🙂 so können Sie aus der Datei Lesen, bis EOF, aber nicht versuchen) c-DATEI und Lesen zu können.
Als ein Beispiel für die Telefon-app, die ich sehen kann, aus ps in android, die den Namen der Anwendungen ist die zu erwartende app-name:
Und überprüfen Sie die cmdline für diese pid gibt eine gute app-name: