从 Java 调用非托管 C\C++ DLL 方法?

问题描述 投票:0回答:1

我一直在查看很多关于如何使用 JNI 从 Java 调用非托管 DLL 方法的示例,但没有一个示例显示 DLL 方法的实际调用。我见过的所有示例都只是打印“Hello World”或将 2 个数字相加。这是一些代码来展示我在说什么。

public class NativeClassWrapper {

    public static native void userLogin(int id, char[] username, char[] password);
    
    static {
        System.loadLibrary("User.dll");
    }

    public static void main(String[] args) {

        userLogin(100000, "user123\0".toCharArray(), "password123\0".toCharArray()); 
    }
}
// javac -h NativeClassWrapper.java generate C header

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class NativeClassWrapper */

#ifndef _Included_NativeClassWrapper
#define _Included_NativeClassWrapper
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jboolean JNICALL Java_dll_call_NativeClassWrapper_userLogin
  (JNIEnv *, jobject, jint, jcharArray, jcharArray);

#ifdef __cplusplus
}
#endif
#endif

此时我不知道如何调用 12 年前的非托管 C/C++ DLL 方法。我是否必须创建 CPP 类文件的全新副本并重命名所有方法以匹配 JNI 生成的方法名称并创建全新的 DLL?在 C# 中,我不需要做类似的事情,因此我提出了问题。

蒂亚

java c++ c
1个回答
0
投票

是的,当使用 JNI 时,您必须将这些方法包装在用 C/C++ 编写的新方法中,这些方法遵守 JNI 所需的调用约定并执行许多额外的官僚工作,例如将对象固定在内存中,以便垃圾收集器当您的核心 C++ 代码尝试访问它们时,不会移动它们。

您看过 JNA 而不是 JNI 吗?这可能会让事情变得更容易。

© www.soinside.com 2019 - 2024. All rights reserved.