Java 怎么样使用JNI调DLL文件里的方法呢?
比如,已知DLL文件里有OPEN(int ip)等等之类,返回值也知道,那如果通过JAVA来访问或者调用这些方法呢
比如,已知DLL文件里有OPEN(int ip)等等之类,返回值也知道,那如果通过JAVA来访问或者调用这些方法呢
解决方案 »
- 新手求助,JTable如何设置某一个单元格为下拉列表
- JAVA语法跟C#如此近似,该注意哪些问题?(C#转JAVA的问题)
- 本类中dispose,是不是容易nullPointer,我碰到好几次了,不得已才放在另外的窗口中去dispose它
- File类的 deleteOnExit()怎么用呢?
- 求上传文件代码,swing方面的
- 请高手为小弟讲解关于JAVA中关于编译时的错误和执行错误的区别
- 怎么样从byte[]类型,转换到char[]类型?
- 在Java程序中怎样动态的检查SQL语句是否正确?
- HELP!!! 关于java进程!解决就+100(急)
- android关于自定义radiobutton做成的横向单选滑动条,在线等答案
- 请推荐一个好用的 eclipse3.3 或者3.4的流行版本下载?? (最好在官网)
- 大家来讨论一下google挑战麻省理工的密码题吧
http://www.feloo.com/it/info.php?id=207224
CSDN原贴。LZ可以看看
System.loadLibrary("java2dll");
}
public static void main(String[] args)
{
String str1="Test";
System.out.println("str2="+cTrim(str1));
} }
我的dll代码
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include "Java2dll.h"
/* Header for class Java2dll */#ifndef _Included_Java2dll
#define _Included_Java2dll
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Java2dll
* Method: cTrim
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_Java2dll_cTrim
(JNIEnv *, jclass, jstring str){
return str;
}
#ifdef __cplusplus
}
#endif
#endif怎么一直报
Exception in thread "main" java.lang.UnsatisfiedLinkError: Java2dll.cTrim(Ljava/
lang/String;)Ljava/lang/String;
错误呢
网上有
很好用的
也解决的回调函数的问题
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;public class TestJNA {
public static void main(String[] args) {
try {
JNative jn = new JNative("calc1.dll", "Calc_Add");
jn.setRetVal(Type.INT);
jn.setParameter(0, 12);
jn.setParameter(1, 254);
jn.invoke();
int result = Integer.parseInt(jn.getRetVal());
System.out.println(result);
} catch (NativeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
1.编写Java类,用该类将DLL对外提供的函数服务进行声明,其中的Java方法均声明为nat
ive,其方法签名可以自定义,不用实现函数体。 2.用Javah工具将该Java类生成对应的.h头文件。
3.最重要的比较麻烦的一步:编写C/C++代码实现.h头文件中声明的函数,该C/C++代码中
包含jni.h头文件,并且编写代码时使用其中定义好的数据类型作为函数的输入和返回数
据类型进行编程。用这种方法实现数据类型转换。例如数据类型:boolean(java) à
jboolean(jni.h: typedef unsigned char
jboolean),在自己编写的C/C++代码中使用数据类型jboolean映射Java中的boolean类型
。在该步骤中,可以在C/C++代码中调用已经存在的DLL库。 4.另外编写的Java代码时就可以使用该Java类了。 在第3步中,编写C/C++函数时,可以使用一个叫interface
pointer的env指针来调用JNI提供的一系列(很多)函数,用这些函数来访问JVM的对象和数
据。 使用JNI的缺点:使用比较麻烦,需要对已有的DLL进行封装,需要对C/C++比较了解。 使用JNI的优点:可以跨平台调用本地库。
看看行不行,老板要求用JNI,郁闷的