在 c++ 程序中使用 Java DLL
Use Java DLL in c++ program
我用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
有关如何获取它的详细信息,请参阅此处。
相关文章:
- Java 调用 dll 字符串返回类型方法
- Java:加载带有char **的C DLL,将回调作为参数
- Java加载DLL,该DLL从JNI中的另一个DLL导出方法
- 如何从 JAVA 程序中访问文件中定义的类.DLL方法
- 如何在 Java 中加载、访问和使用C++ DLL 函数?
- 在SWIG和Visual Studio 2015中使用Java中编译的DLL
- JNA从DLL调用C++对象-java.lang.IollegalArgumentException:Structure
- 如何从Java中的C DLL加载和使用结构和功能
- 如何从 Java 调试 CPP DLL
- 在 c++ 程序中使用 Java DLL
- 用C++为java构建一个dll,它正在调用另一个dll(Eclipse上的JNI)
- 线程"main" java.lang.UnsatisfiedLinkError: Native.initiate(I)V 从 Java 运行本机 dll 时
- 无法在 Heroku (Java) 上加载 DLL
- 使用JNI集成java和.net dll
- C/C++(dll)与JAVA(JAR)中的动态链接
- 如何使用 JNI 将结构数组从 C++ dll 返回到 Java Applet
- 我的Java GUI与我的超酷专有dll接口.如何防止第三方与此 dll 接口
- Java 不会从使用 swig 创建的.dll调用函数
- 如何调试 Java 应用程序的 C++ dll
- SWIG c++ Java DLL Windows