java - 少了一步? loadLibrary() 的参数需要填写什么

标签 java c java-native-interface

这些是我从 Java 程序调用 native 函数所遵循的不完整步骤。

  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 ?
}

这是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/

相关文章:

c - 如何创建位图(在 C 中)?

c - C11 中的原子阵列

C 段错误字符指针

java - Android NDK : No JNI_OnLoad found in . ..跳过 init :但是有 JNI_OnLoad

java - 如何编译具有 native 功能的 c 文件以通过 JNI 连接?

java - android 中 ScrollView 中的图像

java - 使用 Redis 的大文件字数统计的最佳解决方案

java - 将 YUV_420_888 中的图像从 Android 发送到 OpenCV Mat 中的 JNI 的最有效方法

java - Android 搜索界面——显示多个 SearchView

java - 无法加载包含的 JKS keystore