我开始研究Java的JNI功能。我按照这个[教程] [1]。所以我的班级是这样的:
package me.gagan.pheonix.natve;
public class HelloJNI {
static {
System.loadLibrary("hello");
}
private native void sayHello();
public static void main(String... args) {
new HelloJNI().sayHello();
}
}
HelloJNI.c file like this:
\#include <jni.h>
\#include <stdio.h>
\#include "me_gagan_pheonix_natve_HelloJNI.h"
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
printf("Hello World in native C!\n");
return;
}
我的目录结构是:
<pre>
C:.
├───bin
│ ├───me
│ │ └───gagan
│ │ └───pheonix
│ │ └───natve
│ │ └───HelloJNI.class
│ ├───resources
│ │ └───hello.dll
│ ├───me_gagan_pheonix_natve_HelloJNI.h
│ └───HelloJNI.c
└───src
├───me
│ └───gagan
│ └───pheonix
│ └───natve
│ └───HelloJNI.java
└───resources
</pre>
我还添加了
-Djava.library.path=C:\Gagan\workspace\Pheonix\bin\resources
但仍然会出现错误。不知道出了什么问题。正确地遵循每一步。 以下命令对我有用
gcc -Wl,--add-stdcall-alias -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -shared -o hello.dll HelloJNI.c
echo %JAVA_HOME%
C:\Java\jdk1.6.0_45
javah -verbose -jni -classpath . me.gagan.pheonix.natve.HelloJNI
编辑:
遇到异常是:
Exception in thread "main" java.lang.UnsatisfiedLinkError: me.gagan.pheonix.natve.HelloJNI.sayHello()V
at me.gagan.pheonix.natve.HelloJNI.sayHello(Native Method)
at me.gagan.pheonix.natve.HelloJNI.main(HelloJNI.java:12)
[1]: https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html
你们有什么建议吗?
答案 0 :(得分:0)
package me.gagan.pheonix.natve;
public class HelloJNI {
...
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
使用javah
生成.h文件后,您已更改了软件包名称。再做一次,并相应地调整.c文件中的函数名,以便同意.h文件中的声明。