Как загрузить, получить доступ и использовать функции C ++ DLL в Java? - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть DLL, которую я создал в C ++. Это очень просто. DLL предназначена для сложения, вычитания, умножения и деления. Вот код для этого:

Math DLL.cpp

#include "Math.h"

using namespace std;

long addition(long a, long b) {
    return a + b;
}

long subtraction(long a, long b) {
    return a - b;
}

long multiplication(long a, long b) {
    return a * b;
}

long division(long a, long b) {
    // Make sure neither variables are 0 to avoid errors
    if (b != 0 && a != 0)
        return a / b;
    else
        return 0;
}

int testReturn() {
    return 7;
}

Math DLL.h

#ifdef MATH_EXPORTS
#define MATH_API __declspec(dllexport)
#else
#define MATH_API __declspec(dllimport)
#endif

extern "C" MATH_API long addition(long a, long b);

extern "C" MATH_API long subtraction(long a, long b);

extern "C" MATH_API long multiplication(long a, long b);

extern "C" MATH_API long division(long a, long b);

extern "C" MATH_API int testReturn();

При компиляции этот код дает мне файлы Math DLL.dll и Math DLL.lib.

Я знаю, что вы можете запустить это в другой программе на C ++, например:

#include <iostream>
#include <Windows.h>
#include "tchar.h"

typedef int(__stdcall* importFunction)();

using namespace std;

int main() {
    HINSTANCE hGetProcIDDLL = LoadLibrary(_T("Math DLL.dll"));

    if (hGetProcIDDLL == NULL) {
        cout << "Cannot locate the DLL file." << endl;
    }
    else {
        cout << "Found the DLL file!" << endl;
    }

    importFunction testReturn = (importFunction)GetProcAddress(hGetProcIDDLL, "testReturn");
    if (!testReturn) {
        cout << "Could not locate the function" << endl;
    }
    else {
        cout << "testReturn() returned " << testReturn() << endl;
    }

}

Но как вы можете сделать это на Java с Eclipse Photon?

1 Ответ

0 голосов
/ 16 апреля 2019

Это небольшой процесс, но, похоже, он мне подходит. Сначала загрузите библиотеку JNA из здесь . Внутри почтового индекса вы найдете файл .jar. Включите это в свой Java-проект в Eclipse, щелкнув правой кнопкой мыши по своему проекту и выбрав Путь сборки> Настроить путь сборки .

Это автоматически приведет вас к вкладке Библиотеки , но если нет, нажмите на нее. Затем нажмите кнопку Add External JAR справа и найдите файл JNA .jar.

Теперь, когда у вас есть необходимые библиотеки в вашем проекте, создайте новый класс под названием «MathDLL». Отсюда вы можете ввести следующий код:

import com.sun.jna.Library;
import com.sun.jna.Native;

/** Simple example of native library declaration and usage. */
public class MathDLL {
    public interface mathDLL extends Library {
        mathDLL INSTANCE = (mathDLL) Native.loadLibrary("Math DLL", mathDLL.class);

        // Function definition
        long addition(long a, long b);
        long subtraction(long a, long b);
        long multiplication(long a, long b);
        long division(long a, long b);
    }

    public static void main(String[] args) {

        mathDLL dll = mathDLL.INSTANCE;

        // 500 + 531
        long additionResult = dll.addition(500, 531);
        // 250 - 12
        long subtractionResult = dll.subtraction(250, 12);
        // 12 * 12
        long multiplicationResult = dll.multiplication(12, 12);
        // 400 / 20
        long divisionResult = dll.division(400, 20);

        System.out.println("Addition (should be 1031): " + additionResult + ", Subtraction (should be 238): " + subtractionResult + ", Multiplication (should be 144): " + multiplicationResult + ", Division (should be 20): " + divisionResult);

    }
}

Этот код добавит вашу DLL в ваш код (убедитесь, что ваша DLL находится в той же папке, в которой выполняется ваш Java-проект), определите функции, найдите их в DLL во время компиляции, и вы сможете вводить значения и получать возвращаемые значения легко на Java!

Распространенные ошибки

  • Убедитесь, что ваш проект DLL соответствует той же архитектуре вашей системы. Компьютер x86 требует x86 DLL для успешной работы в Java. Компьютер x64 нуждается в DLL x64. Дважды проверьте, что вы экспортировали его как правильную архитектуру.
  • Не ставьте .dll после имени файла в Java. Программа знает, что ищет .dll и выдаст ошибку, если вы ее укажете.
  • Убедитесь, что ваши определения функций и параметры всегда совпадают с теми, которые объявлены в фактической DLL.

Я знаю, что ответил на свой собственный вопрос, но я надеюсь, что помог кому-то получить ответ, который он искал, немного легче, с меньшим количеством бега.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...