Java通过JNI调用dll文件
骨头的程序是JAVA写的,赵工的AI库是一个lib,那么强大不用太可惜了,容我想想......
简单来说:
0-Java 建立需求函数模板
1-使用 javah xxx.class 工具生成.h文件
2-把jni.h、jni_md.h和刚才生成的.h文件放到VS建立的dll空项目里
3-生成可以调用的dll
大功告成
详细点:
例如你要用dll 实现一个Max()函数的功能,先把这个文件编译成class文件
然后用 javah 生成.h 文件
public class TestNative {
private native static int Max(int a, int b);
static {
System.loadLibrary("VCdll");
}
public static void main(String[] args) {
System.out.println(Max(4, 5));
}
}
visual Studio 里:
0-新建->Win32->Win32项目->起个名mydll->下一步->DLL和空项目->完成
1-把jni.h、jni_md.h和刚才生成的.h文件放到头文件里
2-添加新项目->新建c++文件->cpp文件里引用刚才生成的.h文件->实现相关方法->
3-生成dll
4-放在java文件目录下,ok
相关文档:
在成功实现Java调用C++之后,接下来想到能否通过JNA实现Java调用Fortran,今天试验了一下,还是比较容易的。
网上有一个Java调用F95的例子,但是我考虑不仅要实现F95的调用,还要实现F77的调用,所以费了一些周折。
问题的关键在于F77为过程名自动添加了一个尾部的下划线,所以sub1这个过程,到Java一端,就变成了sub1_, ......
最近需要写一段程序,完成以下的工作,用java将数据以二进制的形式写入文件中,然后用C读出此二进制文件。
开始的时候没有考虑机器的字节序,直接搞出segment fault.想了很久,才明白原来是java和C的字节序是不一样的。
java中的字节序是big endian的,它是与机器无关的。而c的字机序是机器相关的,而当前用的机器是x84 ......
为了实现自定义的log类,能够输出具体的代码行行号,通过使用StackTraceElement对象实现了。
这里指出需要注意的几个问题:
1. 程序中返回的代码行行号,是新建StackTrackElement对象的那一行。
2. 可以通过传参的方法实现输出特定行行号。具体实现见代码。
1/**
2 *
3 */
4package leo.demo ......
1.[http://www.javaalmanac.com] Java开发者年鉴一书的在线版本. 要想快速查到某种Java技巧的用法及示例代码, 这是一个不错的去处.
2.[http://www.onjava.com] OReilly的Java网站. 每周都有新文章.
3.[http://java.sun.com] 官方的Java开发者网站 每周都有新文章发表.
4.[http://www.developer.com/java] ......