Java 错过一步?loadLibrary()的参数中需要填写什么
这些是我从java程序调用本机函数所遵循的不完整步骤Java 错过一步?loadLibrary()的参数中需要填写什么,java,c,java-native-interface,Java,C,Java Native Interface,这些是我从java程序调用本机函数所遵循的不完整步骤 编写了一个java程序,然后编译成.class文件 从命令javah-jni中,我生成了一个与.class文件同名的头文件 之后,我打开了一个 C++ VisualExpress ,启动了一个新的项目,并将我的应用程序类型设置为 DLL 这是调用本机c方法的java程序 class HelloWorld { private native void print(); public static void main( String args
.class
文件javah-jni
中,我生成了一个与.class
文件同名的头文件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;
}
#包括
#包括
#包括“HelloWorld.h”
JNIEXPORT void JNICALL
Java_HelloWorld_打印(JNIEnv*env,jobject obj){
printf(“你好,世界!\n”);
返回;
}
我将项目名称保留为jni-tester
,c文件名为HelloWorld.c
在语句System.loadLibrary(??)
中,参数中的库名称应该是什么?(或者在填充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部分。]库名称是DLL文件的名称,而不带.DLL扩展名。DLL必须位于要加载的windows PATH环境变量的目录之一。传递库的名称。您可以省略.dll扩展名,也可以将其包括在内 如果只指定一个不包含路径组件的文件名,则库搜索路径将用于搜索库
或者,您可能更愿意指定可以执行的文件的完整路径。后一种方法通常更可取,因为它允许您精确控制库的加载位置。您是指项目名称吗?我不确定在系统路径目录中删除正在开发的DLL是否是一种好做法。在开发过程中,您可以设置路径,使其包含生成DLL的目录。一旦进入生产环境,您就可以在已知路径中的某个目录中部署DLL。您可以这样做,但不建议这样做。