错过了一步?什么需要填写loadLibrary()的参数

pro*_*eve 3 c java java-native-interface

这些是我从java程序调用本机函数时所遵循的不完整步骤.

  1. 写了一个java程序然后编译成.class文件
  2. 从命令javah - jni我生成了一个与文件同名的头.class文件.
  3. 之后,我打开了一个Microsoft Visual C++ Express,启动了一个新项目并将我的应用程序类型设置为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 ?
}
Run Code Online (Sandbox Code Playgroud)

}

这是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;
}
Run Code Online (Sandbox Code Playgroud)

我将项目名称保留为jni tester,并且c文件名为HelloWorld.c

在语句System.loadLibrary(??)中参数中库的名称应该是什么?(或者在填写loadLibrary的参数之前,我是否缺少任何步骤)

如果是这样,我错过了什么?

Mat*_*Mat 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 ...
Run Code Online (Sandbox Code Playgroud)

[执行此操作并从库名称中删除扩展名使代码的java端尽可能保持可移植性.您将能够按原样将其移动到另一个平台,只需要为该目标重建JNI部件.