这些是我从 Java 程序调用 native 函数所遵循的不完整步骤。
- 写了一个java程序,然后编译成
.class
文件 - 从命令
javah - jni
我生成了一个与.class
文件同名的头文件。 - 之后,我打开了一个 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 ?
}
这是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 的参数之前我是否缺少任何步骤)
如果是这样,我缺少什么?
最佳答案
来自该函数的文档 System.loadLibrary :
Parameters:
libname - the name of the library.
您将 DLL 的名称传递给它。 (也就是说,没有 .dll
扩展名的 DLL 文件名。在类 Unix 系统上,它将是没有 lib
前缀或 的共享对象名称。 so
(或 .o
对于某些平台)扩展名。)
确保您的 JVM 可以在其库路径中找到 DLL。要更改库路径,您可以像这样使用 java.library.path
系统属性:
java -Djava.library.path=directory_where_your_dll_resides ...
[这样做并从库名称中删除扩展名可以使代码的 Java 端尽可能可移植。您将能够按原样将其移动到另一个平台,只需要为该目标重建 JNI 部分。]
关于java - 少了一步? loadLibrary() 的参数需要填写什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7221996/