pro*_*eve 3 c java java-native-interface
这些是我从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 ?
}
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的参数之前,我是否缺少任何步骤)
如果是这样,我错过了什么?
从该函数的文档 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部件.