Как вызвать метод в .Net DLL в программе Java - PullRequest
0 голосов
/ 09 мая 2019

Я пытался использовать .NET DLL из кода Java, tsMemberFunctions.DLL успешно загружен, но код не может вызвать фактическую функцию.

См. Фрагмент ниже:

public class tsMemberFunctions {  
    public native void GetMemberJSONSample();

    static {
        System.loadLibrary("tsMemberFunctions");
        System.out.println("Loaded");
    }

    public static void main(String[] args) {
        new tsMemberFunctions().GetMemberJSONSample();

    }
}

При выполнении вышеприведенного метода я получаю ошибку ниже:

Loaded
Exception in thread "main" java.lang.UnsatisfiedLinkError: tsMemberFunctions.GetMemberJSONSample()V
    at tsMemberFunctions.GetMemberJSONSample(Native Method)
    at tsMemberFunctions.main(tsMemberFunctions.java:12)

Может кто-нибудь сказать мне, если я что-то пропустил или что-то не так в коде, или предложить лучшую альтернативу дляэтот вариант использования.ТИА.

1 Ответ

0 голосов
/ 29 мая 2019

Вы должны быть очень осторожны с именами и экспортом.

Допустим, у вас есть супер простая библиотека

// dllmain.cpp : Defines the entry point for the DLL application.
#include "pch.h"
#include "jni.h"
#include <stdio.h>

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

extern "C" JNIEXPORT void JNICALL Java_recipeNo001_HelloWorld_displayMessage

(JNIEnv* env, jclass obj) {

    printf("Hello world!\n");

}

Вы должны убедиться, что ваш DLL построен для правильной архитектуры (это будет зависеть от вашей версии Java - 32/64 бит).

Допустим, у вас есть x64 DLL и x64 JDK, вы можете назвать свою библиотеку вот так

package recipeNo001;

public class HelloWorld {

    public static native void displayMessage();

    static {
        System.load("C:\\Users\\your_name\\Source\\Repos\\HelloWorld\\x64\\Debug\\HelloWorld.dll");
    }

    public static void main(String[] args) {
      HelloWorld.displayMessage();
    }
}

В вашем случае, держу пари, что в вашем коде нет extern "C", поэтому JVM не может найти ваш символ.

Что касается инструментов, я предлагаю Visual Studio 2019 (когда речь идет о создании DLL) и IntelliJ для кода Java.

Вы можете найти множество образцов здесь: http://jnicookbook.owsiak.org/ и здесь: https://github.com/mkowsiak/jnicookbook

...