我刚刚进入Java世界。当我尝试从Java编译Calling C的示例程序时,我遇到了问题。
我想尝试JNI的示例代码(在SUN-Micro的JNI.PDF中给出)。
代码是这样的:
class HelloWorld {
private native void print();
public static void main(String[] args) {
new HelloWorld().print();
}
static {
System.loadLibrary("HelloWorld");
}
}
我使用javac HelloWorld.java编译,然后使用“javah -jni HelloWorld”获得C程序的.H文件
即使我的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;
}
我使用“gcc -Wl, - add-stdcall-alias -shared -o HelloWorld.dll HelloWorld.c”在Cygwin中创建了.dll
即使我使用了创建共享库的普通Linux方法:“gcc -shared -Wl,-soname,libHelloWorld.so -o libHelloWorld.so HelloWorld.o”
但是当我运行java HelloWorld时,它会返回Aborted!
由于我在Java中没有太多想法,我不确定我哪里出错了。
我检查了类似代码,例如:http://www.inonit.com/cygwin/jni/helloWorld/,但却出现了类似的错误。
答案 0 :(得分:1)
InOnIt页面使用-mno-cygwin。如果您想要Cygwin功能,那么您需要http://elliotth.blogspot.com/2005/08/porting-jni-code-to-win32-with-cygwin.html。自写完以来终结者一直在移动。你想要一个Cygwin安全的Java启动器的源码的关键现在是https://github.com/software-jessies-org/jessies/blob/master/salma-hayek/native/all/java-launcher/java-launcher.cpp。
答案 1 :(得分:1)
我无法JNI
使用Cygwin's g++
- 这会导致cygwin1.dll
的依赖,与JNI mechanism
发生冲突,从而导致崩溃。不再支持-mno-cygwin flag
。但是使用/bin/x86_64-w64-mingw32-g++.exe
为我解决了问题。
答案 2 :(得分:0)
确保通过在System.loadLibrary()
调用周围添加try / catch块来实际加载本机库,以便在无法找到库时捕获UnsatifiedLinkError异常。
如果在您的错误发布后不起作用,“它返回已中止”并不是很有帮助。
此外,您使用void返回类型定义了本机print方法,但是您有一个return语句。删除它或让方法实际返回一些东西。