2016-10-26 2 views
-1

Ich habe bereits über JNI geforscht, und ich denke, ich verstehe, wie es funktioniert, aber ich habe versucht, eine C-Funktion von einer anderen C-Funktion aufzurufen, die von JNI aufgerufen wird.Kann ich eine C-Funktion von einem C-Programm aufrufen, das von JNI aufgerufen wird?

Ich habe 2 .c, HelloWorld und HelloWorld2 und ein Java-Programm, um HelloWorld aufzurufen. HelloWorld ruft gleichzeitig eine in HelloWold2 definierte Funktion auf, dies verursacht jedoch einen Fehler bei der Ausführung.

java: symbol lookup error: /home/hduser/Desktop/final2/libhello.so: undefined symbol: helloworld

+0

Haben Sie überprüft LD_LIBRARY_PATH? –

+1

Willkommen bei SO. Bitte sehen Sie sich [die Tour] (http://stackoverflow.com/tour) an. Sie können auch überprüfen, [Welche Themen kann ich fragen] (http://stackoverflow.com/help/on-topic) und [Wie man eine gute Frage stellen] (http://stackoverflow.com/help/ how-to-ask) und [Die perfekte Frage] (http://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/), und wie man ein [Minimal, Complete und Überprüfbares Beispiel] (http://stackoverflow.com/help/mcve). Veröffentlichen Sie den Code, den Sie versucht haben, und die Fehler, die Sie erhalten haben. Sei so genau wie möglich, denn das führt zu besseren Antworten. –

+0

Ich sehe nicht aus, als ob die zweite Funktion das Problem ist. Es schlägt bereits fehl, wenn versucht wird, irgendeinen C-Code von Java aus aufzurufen. Konnten Sie C-Code überhaupt von Java aus aufrufen? Bitte posten Sie Ihren Code. – Codo

Antwort

1

Angenommen, Sie haben zwei Dateien:

HelloWorld.c HelloWorld2.c

und Hello World soll etwas von HelloWorld2 rufen Sie folgende Möglichkeiten:

  • beide setzen in die gleiche gemeinsame lib
  • setzen beide in separate shared lib und stellen Sie sicher, dass HelloWorld mit Hel verbunden ist loWorld2

Stellen Sie sicher, dass gemeinsam genutzte Bibliotheken sichtbar sind, indem Sie LD_LIBRARY_PATH festlegen.

Sie können einige JNI Proben finden Sie hier: http://jnicookbook.owsiak.org/

+0

Wie kann ich sie beide in die gleiche gemeinsame Bibliothek legen? Und wenn ich sie in separate teile, wie kann ich HelloWorld mit HelloWorld2 verbinden? System.loadLibrary()? – Tortxu13

+0

Werfen Sie einen Blick auf dieses Beispiel: github.com/mkowsiak/jnicookbook/tree/master/recipeNo018 Dieses Beispiel zeigt, wie folgende Anrufe ausführen: Java -> JNI (Aufruf von C-Code) -> von der JNI-Code aufgerufen Rufen Sie einen anderen Code in C auf. github.com/mkowsiak/jnicookbook/tree/master/recipeNo021 Dieses Beispiel wird andererseits beide C-Funktionen innerhalb einer einzelnen freigegebenen Bibliothek platzieren. – mko

Verwandte Themen