6
votes

Ne peut pas exécuter C Programme de Java en utilisant Cygwin

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


1 commentaires

Ne vous inquiétez pas de la longue publication - je pense que c'est une excellente première question.


4 Réponses :


2
votes

Ajouter un fichier d'en-tête généré à l'aide de Javah dans votre fichier C xxx

et exécuté à l'aide de xxx

Si cela ne fonctionne pas que d'essayer xxx

un exemple beaucoup plus détaillé est expliqué dans ce site


4 commentaires

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 , donc je suis un peu confus sur la façon de l'utiliser.



1
votes

Comme je ne peux pas commenter avec ma faible réputation, je le dirai là-bas.

  1. Quel est le résultat de echo% path% dans cmd, voyez-vous clairement le chemin des fichiers binaires de Cygwin?
  2. Quel est le contenu des journaux après java helloworld dans d: \ dokumenty \ cinquième \ src \ hs_err_pid3156.log ?

    Je vais éditer cette réponse après la vôtre.


10 commentaires

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; 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 par exemple et essayez d'écrire ls . Si cela fonctionne, cela montre qu'il n'y a aucun problème avec votre chemin. S'il ne reconnaît pas votre ls , signifie qu'il ne peut pas accéder à votre / usr / bin comme programme avec cygwin1.dll


J'ai successivement allé à D: \ Programy . La commande LS 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


Trouvé quelque chose, essayez d'ajouter le chemin d'accès aux fichiers binaires dans ld_library_path au lieu de chemin . Regardez les commentaires ici .


Malheureusement, cela ne fonctionne pas; Cette fois, j'ai obtenu l'exception de lien insatisfait car il n'y avait aucun ctest.dll dans le répertoire cible. J'ai même essayé de copier mon ctest.dll bibliothèque à d: \ programy \ cygwin \ bin , ainsi que cygwin1.dll au répertoire avec la source Fichiers après cela, mais ni ait travaillé ( violation d'une exception d'exception à nouveau). Merci pour votre temps et vos efforts de toute façon! Edit: Je vais essayer ce ld_library_path chose.


Je ne trouve pas ld_library_path 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 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 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 . Je mettrai à jour ma question originale avec cette information, peut-être que cela aidera d'une manière ou d'une autre.



5
votes

J'ai trouvé que la raison pour laquelle cela ne peut pas être fait, c'est que cygwin1.dll 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.

sont quelques façons de la surmonter; Si vous recherchez une solution, Ce message résume bien ce qui doit être fait et celui-ci peut également être utile. J'ai aussi trouvé une solution explicite ici .


0 commentaires

-1
votes

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


0 commentaires