在 c++ 程序中使用 Java DLL

Posted

技术标签:

【中文标题】在 c++ 程序中使用 Java DLL【英文标题】:Use Java DLL in c++ program 【发布时间】:2016-06-05 10:35:27 【问题描述】:

我使用 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 的名称。

【问题讨论】:

【参考方案1】:

您的 DllImport 名称不正确:

?HelloFromJava@MyFunctions@HelloCPPLibrary@@SAPADXZ

请参阅here了解获取方法的详细信息。

【讨论】:

其实我还有一个比那个更重要的问题。你能帮帮我吗?***.com/questions/37651402/…***.com/questions/37653060/use-c-dll-in-java-program 当然...也许您可以同时将其标记为答案:-)

以上是关于在 c++ 程序中使用 Java DLL的主要内容,如果未能解决你的问题,请参考以下文章

Java调用C++动态链接库dll,有详细过程。VS2015+Eclipse以及失败解决方案

在 C++ 应用程序中使用 DLL

如何在 C++ 运行时组件中的 Windows Phone 8.1 XAML 应用程序中使用 C++ dll

如何在 Java 代码中使用从 .dll 使用和返回对象的函数?

在 C# WPF 或 Windows 窗体应用程序中使用 DirectX c++ DLL

在 VB6 应用程序中使用 C++ DLL