Comment créer une bibliothèque Java (API) avec du code natif via JNI


Mon problème est le suivant.

J'ai besoin de créer une bibliothèque en Java. So far So good. Comme toutes les bibliothèques Java décentes, il doit être utilisable sur n'importe quelle JVM.

Mais la difficulté ici est que cette bibliothèque contiendra beaucoup de code natif.

J'ai quelques connaissances dans JNI. J'ai essayé de créer quelques méthodes native en Java dans une application Android avec Android Studio et avec le Android NDK.

C'est génial je peux faire beaucoup d'exemples HelloWorld. Mais comment puis je exporter ce qu'une bibliothèque ?

Mon projet a besoin de bibliothèques C++ externes. Je voudrais envelopper ces bibliothèques et les utiliser dans un wrapper JNI enveloppé dans une bibliothèque Java.

Voir le schéma suivant : Schéma de l'API Java JNI

Pour rendre les choses encore plus simples, prenez une simple API HelloWorld JNI par exemple. Créez une application de bureau Java (ou toute autre chose). Importez l'API Helloworld JNI (en tant que jar), appelez String HelloWorldJNI_API.sayHello(String yourName) et imprimez le résultat.

Ce qui est requis ici:

  1. L'API JNI déclarera évidemment la méthode sayHello () comme un méthode native;
  2. L'argument (String yourName) est envoyé à JNI;
  3. Le code JNI appelle une bibliothèque interne awesome C++ so qui croque les données et renvoie un "hello" + "yourName" (génial, non ?)
  4. Le code JNI renvoie le résultat sous la forme d'un jstring
  5. Enfin, l'API Java renvoie le résultat sous la forme d'un String et le tour est joué !

Cet exemple simple devrait vous montrer ce que j'essaie de faire.

Author: David Eisenstat, 2015-08-28

1 answers

Eh bien, votre bibliothèque contiendra à la fois le .fichier jar avec le code wrapper java ainsi que les fichiers natifs (.donc si vous êtes basé sur linux, ou .dll si vous êtes sous Windows).

Voici où le plaisir commence:

Parce que le natif est compilé dans le langage d'assemblage du processeur, vous devrez compiler le. so pour toute votre cible prise en charge (par exemple pour tous les Android avec un support natif depuis like forever): armv5, armv7 , armv7s, arm64

Maintenant, vous devrez fournir une archive avec tous les ci-dessus.

C'est le cas lorsque vous voulez une bibliothèque autonome, sans fournir le code au développeur.

Si vous pouvez fournir le code,vous n'avez pas à vous soucier des différentes architectures.

 2
Author: MichaelCMS, 2015-08-28 12:36:39