Я создал простую DLL на Java с JNI. Он содержит одну функцию, возвращает строку «hello from java dll».Использование Java DLL в C++-программе
dll отлично работает, когда я использую «java» в cmd.
Теперь я пытаюсь загрузить эту DLL в другую DLL, которую я написал, используя C++, который уже содержит 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();
И СРР и заголовочные файлы DLL, Java являются:
#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, которое импортирует все методы в DLL C++. Таким образом, в данном случае, я делаю это:
[DllImport("HELLODLL3", EntryPoint = "[email protected]@[email protected]@SAPADXZ")]
public static extern IntPtr HelloFromJava();
И затем я напечатать сообщение:
Console.WriteLine(Marshal.PtrToStringAnsi(HelloFromJava()));
Но я получаю сообщение об ошибке:
Unable to find an entry point named '?' in DLL 'HELLODLL3'
где HELLODLL3 это имя библиотеки C++.
На самом деле у меня есть еще одна проблема, которая важнее, чем эта. Не могли бы вы помочь мне с ними? Http: //stackoverflow.com/questions/37651402/0xc0000005-access-violation-reading-location-0x0000000000000000 http://stackoverflow.com/questions/37653060/use-c-dll -in-java-program – kitsuneFox
Конечно ... может быть, вы можете отметить это как ответ тем временем :-) – Wheezil