我使用JNI在Java中创建了一个简单的DLL。它包含一个函数,返回一个字符串" hello from java dll"。
当我使用" java"时,dll工作正常。在cmd。
现在我试图将这个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,我创建了一个导入c ++ DLL中所有方法的.net应用程序。所以,在这种情况下,我这样做:
[DllImport("HELLODLL3", EntryPoint = "?HelloFromJava@MyFunctions@HelloCPPLibrary@@SAPADXZ")]
public static extern IntPtr HelloFromJava();
然后我打印消息:
Console.WriteLine(Marshal.PtrToStringAnsi(HelloFromJava()));
但我得到错误:
无法找到名为&#39;的入口点?&#39;在DLL&#39; HELLODLL3&#39;
中
其中HELLODLL3是c ++ DLL的名称。
答案 0 :(得分:1)