当前位置: 技术问答>java相关
求救!关于JNI
来源: 互联网 发布时间:2015-04-29
本文导语: Java的类这样: public class HelloWorld { public native void displayHelloWorld(); static { System.loadLibrary("test"); } public static void main(String[] args) { HelloWorld helloWorld1 = new HelloWorld(); helloWorld1.disp...
Java的类这样:
public class HelloWorld {
public native void displayHelloWorld();
static {
System.loadLibrary("test");
}
public static void main(String[] args) {
HelloWorld helloWorld1 = new HelloWorld();
helloWorld1.displayHelloWorld();
}
}
用VC6生成的test.dll放在系统目录下。
HelloWorld helloWorld1 = new HelloWorld();可以顺利执行过去,说明test.dll已经被load,可是当执行helloWorld1.displayHelloWorld();的时候报错:
java.lang.UnsatisfiedLinkError: displayHelloWorld
at testjni.HelloWorld.displayHelloWorld(Native Method)
at testjni.HelloWorld.main(HelloWorld.java:21)
Exception in thread "main"
我使用Jbuilder5。
谢谢!!!!!!!!!
public class HelloWorld {
public native void displayHelloWorld();
static {
System.loadLibrary("test");
}
public static void main(String[] args) {
HelloWorld helloWorld1 = new HelloWorld();
helloWorld1.displayHelloWorld();
}
}
用VC6生成的test.dll放在系统目录下。
HelloWorld helloWorld1 = new HelloWorld();可以顺利执行过去,说明test.dll已经被load,可是当执行helloWorld1.displayHelloWorld();的时候报错:
java.lang.UnsatisfiedLinkError: displayHelloWorld
at testjni.HelloWorld.displayHelloWorld(Native Method)
at testjni.HelloWorld.main(HelloWorld.java:21)
Exception in thread "main"
我使用Jbuilder5。
谢谢!!!!!!!!!
|
有两个地方要注意:
1. 方法的导出,在VC(你是使用vc开发dll吗)工程中的*.def文件中加入
你的方法导出。
像我的是这样的:
; NativeCode.def : Declares the module parameters for the DLL.
LIBRARY "NativeCode"
DESCRIPTION 'NativeCode Windows Dynamic Link Library'
EXPORTS
; Explicit exports can go here
Java_edp_storageagent_StorageManager_initialize @1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2 如果你的dll使支持mfc的,请在每个java native function中加入一段
如
JNIEXPORT void JNICALL Java_edp_storageagent_StorageManager_initialize
(JNIEnv *env, jclass o,jint maxThreadNum)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
your code;
}
如果还是不行,请将你的dll拷贝到和你的class同一个目录,再运行
1. 方法的导出,在VC(你是使用vc开发dll吗)工程中的*.def文件中加入
你的方法导出。
像我的是这样的:
; NativeCode.def : Declares the module parameters for the DLL.
LIBRARY "NativeCode"
DESCRIPTION 'NativeCode Windows Dynamic Link Library'
EXPORTS
; Explicit exports can go here
Java_edp_storageagent_StorageManager_initialize @1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2 如果你的dll使支持mfc的,请在每个java native function中加入一段
如
JNIEXPORT void JNICALL Java_edp_storageagent_StorageManager_initialize
(JNIEnv *env, jclass o,jint maxThreadNum)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
your code;
}
如果还是不行,请将你的dll拷贝到和你的class同一个目录,再运行