2016-06-05 2 views
-1

Я создал простую 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++.

ответ

1

Вы не правильно искаженное имя для DllImport:

[email protected]@[email protected]@SAPADXZ 

См here подробности о том, как получить его.

+0

На самом деле у меня есть еще одна проблема, которая важнее, чем эта. Не могли бы вы помочь мне с ними? Http: //stackoverflow.com/questions/37651402/0xc0000005-access-violation-reading-location-0x0000000000000000 http://stackoverflow.com/questions/37653060/use-c-dll -in-java-program – kitsuneFox

+0

Конечно ... может быть, вы можете отметить это как ответ тем временем :-) – Wheezil

Смежные вопросы