当前位置: 技术问答>java相关
100分相送JNI高手
来源: 互联网 发布时间:2015-08-21
本文导语: 源文件如下: 运行后出错 public class Sample1 { public Sample1() { } static{ System.loadLibrary("Sample1"); } public static void main(String[] args){ Sample1 test = new Sample1(); test.getPort(); Syste...
源文件如下:
运行后出错
public class Sample1 {
public Sample1() {
}
static{
System.loadLibrary("Sample1");
}
public static void main(String[] args){
Sample1 test = new Sample1();
test.getPort();
System.out.println("over");
}
public native void getPort();
}
dll 是通过c++builder生成的。运行后出错。
错误如下:
java.lang.UnsatisfiedLinkError: getPort
at co.thumb.prj.mynative.Sample1.getPort(Native Method)
at co.thumb.prj.mynative.Sample1.main(Sample1.java:24)
Exception in thread "main"
请jni高手不吝赐教。
运行后出错
public class Sample1 {
public Sample1() {
}
static{
System.loadLibrary("Sample1");
}
public static void main(String[] args){
Sample1 test = new Sample1();
test.getPort();
System.out.println("over");
}
public native void getPort();
}
dll 是通过c++builder生成的。运行后出错。
错误如下:
java.lang.UnsatisfiedLinkError: getPort
at co.thumb.prj.mynative.Sample1.getPort(Native Method)
at co.thumb.prj.mynative.Sample1.main(Sample1.java:24)
Exception in thread "main"
请jni高手不吝赐教。
|
只能使用JNI来实现,给一个我写的小例子,仅供参考:
这是一个打印hello world的例子,打印由c的printf来完成
package mytest;
public class HelloNative
{
//将要调用的打印方法声明为native,且直接加分号即可
public native static void greeting();
static
{
//这个dll是有打印函数的c编译成的
//系统在程序开始是导入它,这样才能成功
System.loadLibrary("newPrintfDll");
}
}
//主方法类
package mytest;
import mytest.*;
public class HelloNativeTest
{
public static void main(String[] args)
{
HelloNative.greeting();
}
}
成功!
注意:首先,你要将HelloNative编译成class文件,然后使用javah编译该class文件,生成.h文件(要注意路径,如果有包,要退到包名上一级来编译.h文件,否则即使dll调用成功,也会显示找不到greeting方法)
将该.h文件中的关键代码粘帖到cpp文件中(有vc向导生成一个dll的文件模版),关键代码:
JNIEXPORT void JNICALL Java_mytest_HelloNative_greeting
(JNIEnv* env, jclass cl)//稍做了修改
{
printf("asdfasdf");
}
编译成dll文件,放到如c:winntsystem32下,你的.h文件也要放到相应目录(在编译dll时放到vc98include下,还有jni.h和jni_md.h也要找到它们放入),这样就基本完成了,具体细节我无法讲得太仔细建议去看参考资料.谢谢.
这是一个打印hello world的例子,打印由c的printf来完成
package mytest;
public class HelloNative
{
//将要调用的打印方法声明为native,且直接加分号即可
public native static void greeting();
static
{
//这个dll是有打印函数的c编译成的
//系统在程序开始是导入它,这样才能成功
System.loadLibrary("newPrintfDll");
}
}
//主方法类
package mytest;
import mytest.*;
public class HelloNativeTest
{
public static void main(String[] args)
{
HelloNative.greeting();
}
}
成功!
注意:首先,你要将HelloNative编译成class文件,然后使用javah编译该class文件,生成.h文件(要注意路径,如果有包,要退到包名上一级来编译.h文件,否则即使dll调用成功,也会显示找不到greeting方法)
将该.h文件中的关键代码粘帖到cpp文件中(有vc向导生成一个dll的文件模版),关键代码:
JNIEXPORT void JNICALL Java_mytest_HelloNative_greeting
(JNIEnv* env, jclass cl)//稍做了修改
{
printf("asdfasdf");
}
编译成dll文件,放到如c:winntsystem32下,你的.h文件也要放到相应目录(在编译dll时放到vc98include下,还有jni.h和jni_md.h也要找到它们放入),这样就基本完成了,具体细节我无法讲得太仔细建议去看参考资料.谢谢.
|
留下email,我发一个给你。
|
talisman@kali.com.cn也发个给我看看吧