Je cherche le moyen de compiler des fichiers .class (contenant du byte code java).
Le code ainsi obtenu doit encore pouvoir être chargé par la JVM.
J'ai donc pensé a compilé mes classes en utilisant GCJ qui peut générer une librairie partagé (un fichier .so).
Pour utilisé cette librairie, j'ai pensé charger cette librairie avec la méthode "System.loadLibrary" et pouvoir réécrire une implémentation de la classe en déclarant toutes les méthodes "native".
Voici mon code:
La méthode HelloWorld.sayHello étant bien déclaré native.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public class Main { static { System.loadLibrary("helloworld"); } public static void main(String[] args) throws Exception { HelloWorld.sayHello(); } }
Le problème c'est que j'ai une erreur lors de l'execution
Si je comprend bien l'erreur, la JVM ne trouve pas la méthode native correspondante.[java] Exception in thread "main" java.lang.UnsatisfiedLinkError: sayHello
[java] at HelloWorld.sayHello(Native Method)
[java] at Main.main(Unknown Source)
[java] Java Result: 1
Pour construire ma librairie partagé, j'ai créé une implémentation (non native) de la classe HelloWorld que j'ai ensuite compilé avec GCJ.
Je suppose que la compilation GCJ n'est pas tout a fait correcte et que le résultat ne respecte pas les convention JNI.
Première question : Est ce faisable ?
Deuxième : Comment ? (je suppose qu'il manque quelque chose lors de la compimation avec GCJ mais je ne sais pas quoi).
PS: Je suis prêt à compiler mon code avec autre chose que GCJ si besoin.
Partager