Comment mélanger des fichiers .so 32 et 64 bits dans une application

Carmelo M 09/15/2017. 1 answers, 84 views
java android android linux android-ndk android-ndk ndk-build

Tout d'abord, je sais que dans une application ne permet pas l'utilisation mixte des différentes architectures du fichier .so (La partie n'utilise que 32, l'autre partie n'utilise que 64)

J'ai donc essayé d'ouvrir un nouveau processus pour charger dynamiquement les fichiers 64 et 32 ​​bits, mais System.load() lance l'erreur et l'application plante! Comment résoudre ce problème grâce à plusieurs processus? Ou y a-t-il un autre moyen de résoudre ce problème?

5 Comments
Markus 07/27/2017
Bienvenue à SO! S'il vous plaît prenez le temps de lire les pages d'aide , en particulier les sections intitulées "Quels sujets puis-je poser à propos ici?" et "Quels types de questions devrais-je éviter de poser?" . Aussi s'il vous plaît prendre la visite et lire sur la façon de poser de bonnes questions . Enfin, apprenez comment créer un exemple minimal, complet et vérifiable . Les détails sur l'erreur aideraient beaucoup.
Alex Cohn 07/27/2017
C'est une bonne idée! Mais quel genre de processus d'enfant voulez-vous commencer? Un service? Je ne pense pas que cela puisse fonctionner, car le système décide d'activer le mode 32 bits en fonction de l'analyse de votre APK, et la JVM est configurée en conséquence.
Alex Cohn 07/27/2017
Voir stackoverflow.com/a/31879900/192373 : le pm peut forcer l'ABI lors de l'installation de l'application.
Carmelo M 07/28/2017
@AlexCohn Merci! Je suis d'accord avec vous, un processus enfant (Activity) ne peut pas résoudre ce problème. [Stackoverflow.com/a/31879900/192373] ne fonctionne pas, car je souhaite qu'une partie de la fonction utilise le .so 32 bits et une partie du La fonction utilise 64 bits .so, dans la même application.
Carmelo M 07/28/2017
@AlexCohn Avez-vous d'autres idées? Maîtriser

1 Answers


Alex Cohn 07/30/2017.

Eh bien, j'ai essayé. À première vue, cela fonctionne: utilisez les armeabi partagées armeabi 'de la manière habituelle', et exécutez un exécutable arm64-v8a depuis Java avec Runtime.exec () ou depuis C avec system () .

Vous pouvez placer l'exécutable dans des ressources et le décompacter manuellement, ou vous pouvez le tricher et le renommer de sorte qu'il commence par lib et se termine par .so ; maintenant vous pouvez mettre ce fichier dans le jniLibs/armeabi .

Le contraire fonctionne aussi: lancer un exécutable 32 bits (ne pas oublier -fPIE ) de l'application 64 bits.

Assurez-vous que les chemins de recherche de la bibliothèque ne sont pas incompatibles.

2 comments
Carmelo M 08/04/2017
C'est une bonne idée !!! Mon projet n'est pas similaire à l'opération de fond de transcodage vidéo, mais doit charger les graphiques en trois dimensions, à travers le SurfaceView pour interagir avec les gestes de l'utilisateur. Comment faire face à ces interactions de l'interface utilisateur est un gros problème, j'espère que vous pouvez me donner quelques idées, merci
Alex Cohn 08/04/2017
Je ne pense pas que vous pouvez gérer l'interface utilisateur ou effectuer des graphiques en direct via la communication interprocessus

Related questions

Hot questions

Language

Popular Tags