Je crée un widget que nous fournirons aux utilisateurs finaux des développeurs et il se compose d'un .jar
Et d'une bibliothèque native (.so
) Construite à l'aide du NDK. Le JAR possède une interface JNI vers la bibliothèque dynamique.
Il est très clair comment inclure un .jar
Externe dans un projet mais pas comment inclure une bibliothèque dynamique dépendante.
Comment empaqueter et construire les .jar
Et .so
? Quelles sont les meilleures pratiques ici?
Je peux créer le fichier JAR en utilisant la commande jar du JDK. Dois-je exécuter dx.bat sur le bocal pour convertir en bytecode Dalvik?
J'ai besoin de créer un exemple de projet montrant le widget en action. Comment puis-je inclure ces .jar
Et .so
Dans un exemple de projet qui montre comment utiliser le widget?
J'ai passé un peu de temps là-dessus, et je ne comprends tout simplement pas pourquoi cela n'est pas écrit sur la documentation de wikitude .... de toute façon suivez ces changements!
Pour cela, vous devez utiliser les outils de construction standard inclus avec le SDK. Si vous incluez les fichiers .jar dont vous avez besoin dans le /lib
répertoire de votre projet, le processus de génération de fourmi convertira les fichiers de classe inclus au format bytecode Dalvik et les inclura dans votre fichier classes.dex pour l'application. Ajouter un build.properties
fichier également à la racine de votre projet, avec une seule ligne:
external.libs.dir=lib
Selon la version de votre SDK et sa configuration, vous devrez peut-être placer le bocal dans libs
plutôt que lib
.
En ce qui concerne le .so, je suppose qu'il est correctement compilé à l'aide du NDK Android, ou à l'aide d'un script de construction qui utilise le compilateur approprié et les indicateurs de compilateur requis pour lier avec succès l'objet partagé sur Android Si tel est le cas, vous pouvez inclure le fichier .so dans libs/armeabi
et ils seront également ajoutés dans le pot. De plus, le chargeur de bibliothèque dynamique saura chercher à cet emplacement dans le .jar lorsque vous essayez de charger la bibliothèque à partir de Java code.
En utilisant ADT 12, j'ai accompli cela en procédant comme suit:
1) Exportez le fichier JAR de votre bibliothèque avec le fichier SO à l'aide d'Eclipse. Assurez-vous d'exclure AndroidManifest.xml. Cela inclura le code source et d'autres données, donc si vous distribuez, vous voudrez pour supprimer ces bits inutiles à l'aide de n'importe quel utilitaire Zip.
2) Créez un répertoire dans l'arborescence source de votre application (j'utilise le répertoire "lib") et copiez-y votre JAR de bibliothèque.
3) Faites un clic droit sur le projet dans Eclipse et sélectionnez "Configurer le chemin de génération". Ajoutez JAR et pointez-le sur JAR dans l'arborescence source de votre application.
4) Dans vos préférences Eclipse, sélectionnez la section Android/Build et décochez "Actualiser automatiquement le dossier Resources and Assets lors de la build". Vous remarquerez une option ci-dessous qui dit "Forcer l'erreur lorsque les pots externes contiennent des bibliothèques natives." Il y a un bug ADT, qui sera censé être corrigé dans R17, qui utilise le mauvais paramètre. Une fois qu'il est corrigé, vous utiliserez celui "Forcer l'erreur" (assurez-vous qu'il n'est pas coché).
5) Une fois que vous avez construit votre APK d'application, vous aurez un fichier libs/armeabi/libXXXX.so. Cela ne sera pas décompressé automatiquement lors de l'installation. Vous devrez écrire du code pour l'extraire de votre fichier APK dans votre répertoire de données, puis utiliser System.load sur le fichier .so de votre répertoire de données.
J'ai des appels JNI bidirectionnels à partir du fichier chargé dynamiquement et j'utilise même dlopen () dessus pour faire mon enregistrement de plugin personnalisé.
Ajoutez les lignes ci-dessous à Android.mk
.
include $(BUILD_PACKAGE)
LOCAL_PREBUILT_STATIC_Java_LIBRARIES := alias:libs/your.jar
include $(BUILD_MULTI_PREBUILT)