web-dev-qa-db-fra.com

Création d'un SDK de produit: comment ajouter une bibliothèque native (.so) et un bocal avec le SDK que je crée?

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.

  1. Comment empaqueter et construire les .jar Et .so? Quelles sont les meilleures pratiques ici?

  2. 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?

  3. 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?

41
The Sarge

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!

  • allez dans windows/preferences/Android/build
  • décochez la première et la deuxième option
  • extraire les fichiers de wikitudesdk.jar avec winrar comme s'il s'agissait d'une archive, recherchez libarchitect.so et copiez-le dans/libs/libs/armeabi /
  • ajoutez wikitudesdk.jar à votre chemin de construction

enter image description here

23
Alessandro Annini

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.

10
Jason LeBrun

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é.

8
n8n8baby

Ajoutez les lignes ci-dessous à Android.mk.

include $(BUILD_PACKAGE)

LOCAL_PREBUILT_STATIC_Java_LIBRARIES := alias:libs/your.jar

include $(BUILD_MULTI_PREBUILT)
1
aganpro