Вы должны быть очень осторожны с именами и экспортом.
Допустим, у вас есть супер простая библиотека
// 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