在 c++ 程序中使用 Java DLL

Use Java DLL in c++ program

本文关键字:Java DLL c++ 程序      更新时间:2023-10-16

我用JNI在Java中创建了一个简单的DLL。它包含一个函数,返回一个字符串"hello from java dll"。

当我在cmd中使用"java"时,dll工作正常。

现在我正在尝试将此 DLL 加载到我使用 c++ 编写的另一个 DLL 中,该 DLL 已经包含 2 个工作函数。

所以我这样做了:

char* MyFunctions::HelloFromJava() {
            HMODULE myDll = LoadLibrary(L"TestJavaDll.dll");
            if (myDll != NULL) {
                auto fun = (fun_ptr)GetProcAddress(myDll,"HelloFromJava");
                if (fun != NULL)
                    return fun();
                else
                    return "Can't find HelloFromJava";
                FreeLibrary(myDll);
            }
            else {
                return "Can't find TestJavaDll.dll";
                return "GetLastError()=";
            }
        }

在标题中:

    static __declspec(dllexport) char* HelloFromJava();

Java dll 的 cpp 和头文件是:

#include <jni.h>
#include <stdio.h>
#include <windows.h>
#include "TestJavaDll.h"
JNIEXPORT jstring JNICALL
Java_TestJavaDll_HelloFromJava(JNIEnv *env, jobject obj)
{
    return env->NewStringUTF("Hello From Java Dll");
}
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class TestJavaDll */
#ifndef _Included_TestJavaDll
#define _Included_TestJavaDll
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     TestJavaDll
 * Method:    HelloFromJava
 * Signature: ()V
 */
JNIEXPORT jstring JNICALL Java_TestJavaDll_HelloFromJava
  (JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
为了测试 c++ DLL,

我创建了一个 .net 应用程序,该应用程序导入 c++ DLL 中的所有方法。所以,在这种情况下,我这样做:

[DllImport("HELLODLL3", EntryPoint = "?HelloFromJava@MyFunctions@HelloCPPLibrary@@SAPADXZ")]
        public static extern IntPtr HelloFromJava();

然后我打印消息:

Console.WriteLine(Marshal.PtrToStringAnsi(HelloFromJava()));

但是我得到错误:

无法在 DLL"HELLODLL3"中找到名为"?"的入口点

其中HELLODLL3是 C++ DLL 的名称。

您没有 DllImport 的正确损坏名称:

?HelloFromJava@MyFunctions@HelloCPPLibrary@@SAPADXZ

有关如何获取它的详细信息,请参阅此处。