这些是我从java程序调用本机函数时所遵循的不完整步骤。
.class
文件javah - jni
我生成了一个与.class
文件同名的头文件。dll
。这是调用本机c方法的java程序。
class HelloWorld {
private native void print();
public static void main( String args[] ) {
new HelloWorld().print();
}
static {
System.loadLibrary("??"); // what should i write here ?
}
}
这是c程序
#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"
JNIEXPORT void JNICALL
Java_HelloWorld_print( JNIEnv *env , jobject obj) {
printf("Hello World!\n");
return;
}
我将项目名称保留为jni tester
,c文件名为HelloWorld.c
在语句System.loadLibrary(??)
参数中库的名称应该是什么? (或者在填写loadLibrary的参数之前,我是否缺少任何步骤)
如果是这样,我错过了什么?
答案 0 :(得分:5)
从该功能的文档中 System.loadLibrary:
<强>参数:强>
libname - 库的名称。
您将DLL的名称传递给它。 (也就是说,没有.dll
扩展名的DLL的文件名。在类Unix系统上,它将是没有lib
前缀或.so
(或.o
的共享对象名称。对于某些平台)扩展。)
确保您的JVM可以在其库路径中找到DLL。要更改库路径,可以使用java.library.path
系统属性,如下所示:
java -Djava.library.path=directory_where_your_dll_resides ...
[执行此操作并从库名称中删除扩展名使代码的java端尽可能地保持可移植性。您将能够按原样将其移动到另一个平台,只需要为该目标重建JNI部分。]
答案 1 :(得分:4)
库名是DLL文件的名称,没有.dll扩展名。 DLL必须位于要加载的Windows PATH环境变量的其中一个目录中。
答案 2 :(得分:2)
传递库的名称。您可以省略.dll扩展名,也可以包含它。
如果只指定一个没有路径组件的文件名,则库搜索路径将用于搜索库。
或者,您可能更喜欢指定文件的完整路径,您可以这样做。后一种方法通常更受欢迎,因为它允许您精确控制库的加载位置。