【发布时间】: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 的名称。
【问题讨论】:
标签: c# c++ .net dll java-native-interface