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.
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:
- L'API JNI déclarera évidemment la méthode sayHello () comme un méthode native;
- L'argument (
String yourName
) est envoyé à JNI; - Le code JNI appelle une bibliothèque interne awesome C++ so qui croque les données et renvoie un "hello" + "yourName" (génial, non ?)
- Le code JNI renvoie le résultat sous la forme d'un
jstring
- 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.
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.