Использование Java / JNI на Cygwin
Я вхожу в мир Java только сейчас. Я сталкиваюсь с проблемой, когда пытаюсь скомпилировать пример программы для вызова C из Java.
Я хотел попробовать пример кода для JNI (который приведен в JNI.PDF от SUN-Micro).
Код выглядит примерно так:
class HelloWorld {
private native void print();
public static void main(String[] args) {
new HelloWorld().print();
}
static {
System.loadLibrary("HelloWorld");
}
}
Я скомпилировал с помощью javac HelloWorld.java и после этого получил.H файл для программы на C, используя "javah -jni HelloWorld"
Даже мой C-код также прост с:
#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"
JNIEXPORT void JNICALL
Java_HelloWorld_print(JNIEnv *env, jobject obj)
{
printf("Hello World!\n");
return;
}
Я создал.dll в Cygwin, используя "gcc -Wl, - add-stdcall-alias -shared -o HelloWorld.dll HelloWorld.c"
Даже я использовал обычный Linux-метод создания Shared Lib: "gcc -shared -Wl,-soname,libHelloWorld.so -o libHelloWorld.so HelloWorld.o"
Но когда я запускаю java HelloWorld, он возвращает Aborted!
Так как я не очень разбираюсь в Java, я не уверен, где я ошибаюсь.
Я проверил похожий код, присутствующий на нескольких сайтах, таких как: http://www.inonit.com/cygwin/jni/helloWorld/ но получил похожую ошибку.
3 ответа
На странице InOnIt используется -mno-cygwin. Если вам нужна функциональность Cygwin, вам понадобится http://elliotth.blogspot.com/2005/08/porting-jni-code-to-win32-with-cygwin.html. Терминатор переехал, так как это было написано. Суть источника, который вам нужен для запуска Cygwin-Safe для Java, теперь находится по адресу https://github.com/software-jessies-org/jessies/blob/master/salma-hayek/native/all/java-launcher/java-launcher.cpp.
Я не мог получить JNI
работать с Cygwin's g++
- это вызывает зависимость от cygwin1.dll
, который сталкивается с JNI mechanism
, вызывая аварию. -mno-cygwin flag
больше не поддерживается. Но используя /bin/x86_64-w64-mingw32-g++.exe
исправил проблему для меня.
Убедитесь, что ваша нативная библиотека действительно загружена, добавив блок try/catch вокруг System.loadLibrary()
вызовите, чтобы перехватить исключение UnsatifiedLinkError, если ваша библиотека не может быть найдена. Если это не сработает, опубликуйте вашу ошибку, "возвращение прервано" не очень полезно. Кроме того, вы определили собственный метод печати с возвращаемым типом void, но у вас есть оператор return. Либо удалите это, либо позвольте методу на самом деле что-то вернуть.