J'essaie de faire mon premier programme Java / C à l'aide de JNI. Voici comment "mon" code semble - il est copié à partir de Ce site Web :
$ java HelloWorld # # A fatal error has been detected by the Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000018011ae47, pid=3156, tid=1176 # # JRE version: Java(TM) SE Runtime Environment (8.0_31-b13) (build 1.8.0_31-b13) # Java VM: Java HotSpot(TM) 64-Bit Server VM (25.31-b07 mixed mode windows-amd64 compressed oops) # Problematic frame: # C [cygwin1.dll+0xdae47] # # Failed to write core dump. Minidumps are not enabled by default on client versions of Windows # # An error report file with more information is saved as: # D:\Dokumenty\Fifth\src\hs_err_pid3156.log # # If you would like to submit a bug report, please visit: # http://bugreport.java.com/bugreport/crash.jsp # The crash happened outside the Java Virtual Machine in native code. # See problematic frame for where to report the bug. #
4 Réponses :
Ajouter un fichier d'en-tête généré à l'aide de et exécuté à l'aide de p> Si cela ne fonctionne pas que d'essayer p> un exemple beaucoup plus détaillé est expliqué dans ce site p> p> Javah code> dans votre fichier C
Merci pour votre réponse. J'ai ajouté le fichier d'en-tête lorsque vous avez correctement suggéré et compilé le fichier, mais le problème (erreur avec Cygwin1.dll) persiste toujours, peu importe si je spécifie le java.library.path ou non.
@Tilwaen Okk que vous pouvez simplement suivre le site donné pour obtenir le résultat souhaité? si c'est possible?
@Tilwaen upvote et marquez-la comme une réponse correcte si cela vous a aidé :)
J'ai suivi les instructions, même réalisée un nouveau projet avec le même code que celui que proposé (je n'ai ajouté que deux bibliothèques au fichier C qu'ils ont omis), compilées avec Cygwin comme je l'ai fait dans mon message d'origine et obtenu exactement la même erreur. J'ai aussi téléchargé TCC qu'ils utilisent, mais d'une manière ou d'une autre ne peut pas le faire fonctionner - Cygwin a son terminal, mais ce compilateur ne semble pas avoir une et Windows CMD classique ne reconnaît pas la commande TCC i> , donc je suis un peu confus sur la façon de l'utiliser.
Comme je ne peux pas commenter avec ma faible réputation, je le dirai là-bas. P>
echo% path% code> dans cmd, voyez-vous clairement le chemin des fichiers binaires de Cygwin? Li>
- Quel est le contenu des journaux après
java helloworld code> dans d: \ dokumenty \ cinquième \ src \ hs_err_pid3156.log code>? LI>
ol>
Je vais éditer cette réponse après la vôtre. p>
1. Oui, il y a D: \ Programy \ Cygwin \ bin; - Entrée pressée trop tôt, éditer -
Oh bien, les commentaires ne peuvent être édités que 5 minutes ... désolé je ne peux pas éditer le précédent. Quant à vos questions: 1. Oui, il y a d: \ programy \ cygwin \ bin; code> parmi les autres chemins. 2. Parce que le journal est assez long, je l'ai mis sur Pastebin . J'ai déjà supprimé le journal à mon message d'origine, celui-ci est lié au code sur le site Web que Bhargav Modi posté, que j'ai essayé plus tard, mais je pense que cela se rapporte au même problème (Cygwin1.dll).
Pour tester si cela fonctionne, ouvrez un cmd, allez à votre d: \ programmy code> par exemple et essayez d'écrire
ls code>. Si cela fonctionne, cela montre qu'il n'y a aucun problème avec votre chemin. S'il ne reconnaît pas votre
ls code>, signifie qu'il ne peut pas accéder à votre
/ usr / bin code> comme programme avec
cygwin1.dll code>
J'ai successivement allé à D: \ Programy Code>.
La commande LS code> a fonctionné sans faille, il a trouvé chaque dossier, y compris le cygwin.
Je ne sais pas désolé. Peut-être essayez peut-être java -djava.library.path = "d: \ programy \ cygwin \ bin" helloworld code>
Trouvé quelque chose, essayez d'ajouter le chemin d'accès aux fichiers binaires dans ld_library_path code> au lieu de
chemin code>. Regardez les commentaires ici .
Malheureusement, cela ne fonctionne pas; Cette fois, j'ai obtenu l'exception de lien insatisfait code> car il n'y avait aucun
ctest.dll code> dans le répertoire cible. J'ai même essayé de copier mon
ctest.dll code> bibliothèque à
d: \ programy \ cygwin \ bin code>, ainsi que
cygwin1.dll code> au répertoire avec la source Fichiers après cela, mais ni ait travaillé (
violation d'une exception d'exception code> à nouveau). Merci pour votre temps et vos efforts de toute façon! Edit: Je vais essayer ce
ld_library_path code> chose.
Je ne trouve pas ld_library_path code> dans mes variables d'environnement système; Même dans le lien que vous avez posté, ils disent que c'est sur des systèmes UNIX, mais je travaille sur Windows. Devrais-je essayer de créer une nouvelle variable d'environnement système?
Essayez de l'ajouter: exporter ld_library_path = / chemin / vous / veux code> en cygwin (ce sera temporaire) ou dans le .bstrucc de sorte qu'il s'agisse d'initialiser chaque lancement
Toujours pas de progrès, même avec le ld_library_path code> défini comme vous l'avez suggéré. J'ai remarqué la chose la plus étrange maintenant, cependant - et je suis un peu honte que je ne l'ai pas remarquée plus tôt - lors de la compilation du fichier C avec la commande GCC, cela ne fait aucun fichier exécutable. Il ne jette pas non plus d'erreur ni d'avertissement, juste rien i>. Je mettrai à jour ma question originale avec cette information, peut-être que cela aidera d'une manière ou d'une autre.
J'ai trouvé que la raison pour laquelle cela ne peut pas être fait, c'est que là sont em> quelques façons de la surmonter; Si vous recherchez une solution, cygwin1.dll code> ne peut pas être chargé de manière dynamique, car il nécessite 4K des octets de pile inférieurs pour être libre lors de son initialisation - ce qui pourrait être un problème si C'est appelé de Jni. P>
J'ai compris une solution à ce problème. Lors de l'exécution du script de configuration, utilisez
./configure --disable-static --enable-shared --host=x86_64-w64-mingw32
Ne vous inquiétez pas de la longue publication - je pense que c'est une excellente première question.