Jnative java调用c/c++ dll运行出错,提示找不到方法,怎么解决啊
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jnative java调用c/c++ dll运行出错,提示找不到方法,怎么解决啊相关的知识,希望对你有一定的参考价值。
如;C++ dll为mydll.dll。
_declspec(dllexport) int add(int a,int b)
return a+b;
_declspec(dllexport) int subtract(int a,int b)
return a-b;
我想在Java中调用add()方法,具体怎么实现。
关键字native
本质上是java代码调用本地动态链接库
JNI使用的工具:bin/javah.exe
测试代码:
public class Test
//使用static块来加载动态链接库
static
System.loadLibrary("HelloWorld"); //不要加.dll后缀,有java系统自动判断后缀
public native void output();
public static void main(String[] args)
Test test = new Test();
test.output();
/*
System.loadLibrary(HelloWorld);
//等价于
Runtime.getRuntime().loadLibrary("HelloWorld");
*/
编译好后,在命令行上用javah Test生成对应的Test.h
然后使用C/C++编写工具,使用vs2008,创建一个win32工程,生成dll文件
在这里需要配置jdk/include/目录和jdk/include/win32目录的头文件包含到vc工程(或者直接将两个头文件jni.h和jni_md.h拷贝到工程即可)
将生成的Test.h和jni.h包含到工程
JNIEXPORT void JNICALL Java_Test_output
(JNIEnv *, jobject);
并实现该函数
编译生成dll
将dll文件复制到jdk/bin目录下即可
个人的笔记来的,希望对你有帮助,那个dll文件的位置应该可以改的,我菜鸟,只知道放在jdk/bin下可以追问
你能给出你的dll代码吗,
我依照你的方法试试,我弄了几天了,都不行,我从jna到jnative都没成功。
谢谢了。
我在运行java时提示,找不到我方法,如add();
JAVA调用动态链接库DLL之JNative学习
JAVA调用动态链接库DLL的方法有:JNI(Java Native Interface),JInvoke,JNative(Java to native interface),JNI是JAVA自身提供的方法;JInvoke从何而来不得而知,好像还需要注册付费的,64位的JDK、JIR环境下运行不了,在VMware下安装的WindowsXP下同样有问题;JNative是开源的,但相关资料文档也特别的少,好像已经停止更新了。JNative源码地址:http://jnative.cvs.sourceforge.net/viewvc/jnative/,jar包下载地址:http://sourceforge.net/projects/jnative/files/jnative/。
开发环境:myeclipse-10.7-offline-installer-windows
文件》新建》JAVA项目:
输入项目名称,单击“Finish”:
单击鼠标右键》新建》类:
输入包名,类名,勾选“public static void main(String[] args)”,单击“Finish”:
打开项目文件目录:
将要调用的DLL文件“EhfscliaxDll.dll”复制到此目录下,该DLL的代码请参考:VS2010编写动态链接库DLL及单元测试用例,调用DLL测试正确性
新建“lib”文件夹,将JNative.jar复制到此目录下:
配置编译目录:
单击“Add External JARs”添加jar包,下图为已经添加过的:
Helper类代码:
package com.ehfscliax;
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.pointers.Pointer;
public class Helper {
/**
* @param args
* @throws NativeException
*/
public static void main(String[] args) throws NativeException {
JNative.setLoggingEnabled(true);
try {
JNative getUrl = new JNative("EhfscliaxDll.dll", "getUrl"); //创建 getUrl 方法的JNative对象
getUrl.setRetVal(Type.STRING); //设置返回值类型为:String
getUrl.setParameter(0, "127.0.0.1"); //按顺序设置方法需要的参数值
getUrl.setParameter(1, 10087);
getUrl.setParameter(2, 123);
getUrl.invoke(); //调用方法
System.out.println(getUrl.getRetVal()); //输出返回值
} catch (IllegalAccessException e) {
e.printStackTrace();
}
try {
JNative getPlayUrl = new JNative("EhfscliaxDll.dll", "getPlayUrl");
getPlayUrl.setRetVal(Type.INT); //此方法在DLL中定义的返回值类型为:const wchar_t*,如果设置返回值类型为:String,则只能获取到返回值的第一个字符
String mgrIp = "127.0.0.1";
Pointer ptr = Pointer.createPointerFromString(mgrIp);
getPlayUrl.setParameter(0, ptr);
getPlayUrl.setParameter(1, 10087);
getPlayUrl.setParameter(2, 123);
getPlayUrl.invoke();
//个人理解getRetValAsInt是获取返回值的指针地址,getUnicodeMemoryAsString方法从指针地址的内存中读取字符串
String url = JNative.getUnicodeMemoryAsString(getPlayUrl.getRetValAsInt());
System.out.println(url);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
执行结果:
2014-5-25 22:48:46, [DEBUG] [org.xvolks.jnative.JNative] [loadLibrary]: Successfully loaded library ‘EhfscliaxDll.dll‘, functionName = getUrl: hModule = 268435456
http://中文127.0.0.1:10087
2014-5-25 22:48:46, [DEBUG] [org.xvolks.jnative.pointers.memory.MemoryBlockFactory] [setPreferredMemoryType]: Using org.xvolks.jnative.pointers.memory.HeapMemoryBlock memory reservation strategy
http://-?17001:10087
2014-5-25 22:48:46, [DEBUG] [org.xvolks.jnative.JNative] [unLoad]: Unloading native library ‘EhfscliaxDll.dll‘
getUrl方法的返回值类型为:const char*,结果是正常的,getPlayUrl的返回值类型为:const wchar_t*,虽然通过getUnicodeMemoryAsString读取到了返回值,不是第一个字符,但中文乱码的问题一直没能解决。本学习项目源码下载:http://download.csdn.net/detail/testcs_dn/7400203
你可能会遇到以下问题:
如何捕获 System.loadLibrary 产生的异常?
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow
以上是关于Jnative java调用c/c++ dll运行出错,提示找不到方法,怎么解决啊的主要内容,如果未能解决你的问题,请参考以下文章