Не получается вызвать метод из с++ через java native interface,вызывается исключение

99
15 июля 2021, 23:20

#include "pch.h"

FARPROC loadDll(LPCWSTR dllname, LPCSTR  procName)
{
    setlocale(LC_ALL, "Rus");
    HMODULE dll = LoadLibraryW(dllname);
    if (!dll) {
        cout << "dll не загружена";
        system("pause");
    }
    FARPROC farproc = GetProcAddress(dll, procName);
    if (!farproc) {
        cout << "функция из dll не загружена";
        system("pause");
    }
    return farproc;
    FreeLibrary(dll);
}


jint java(JavaVM **vm, void **env ) {
    typedef jint(*jNI_CreateJavaVM)(JavaVM **, void **, void *);

    JavaVMInitArgs vm_args;
    JavaVMOption* options = new JavaVMOption[4];
    vm_args.version = 0x000c0000;
    vm_args.options = options;
    vm_args.nOptions = 4;
    vm_args.ignoreUnrecognized = FALSE;
    options[0].optionString = (char*)"-Djava.compiler=NONE";           
    options[1].optionString = (char*)"-Djava.class.path=C:/Program Files/Java/jdk-12.0.2/lib";  
    options[2].optionString = (char*)"-Djava.library.path=c:";   
    options[3].optionString = (char*)"-verbose:jni";

    jNI_CreateJavaVM   JNI_CreateJavaVM = (jNI_CreateJavaVM)loadDll(L"C:/Program Files/Java/jdk-12.0.2/bin/server/jvm.dll", "JNI_CreateJavaVM");
    jint i = JNI_CreateJavaVM(vm, env, (void*)&vm_args);

    return i;
    delete options;
}


int main(int argc, char **argv)
{
    JavaVM **vm;
    JNIEnv  *env;
    jint j = java(vm, (void**)env);
    jclass cls = env->FindClass("java.base/java/io/PrintWriter");
    jmethodID method=env->GetMethodID(cls, "println",("Ljava/lang/String;)V");
    cout << "" << endl;
    return 0;
}
Answer 1

У вас ошибка в вызове функции jint j = java(vm, (void**)env); В этом месте вы кастуете обычный указатель к указателю на указатель, а надо добавить операцию взятия адреса. Также неправильно объявлен указатель на JavaVM - он должен быть объявлен как обычный указатель, и при передаче параметра тоже не забываем взятие адреса.

JavaVM *vm;
JNIEnv *env;
jint j = java(&vm, (void**)&env);
READ ALSO
Как выровнять элементы по горизонтали? Менеджеры компоновки Java

Как выровнять элементы по горизонтали? Менеджеры компоновки Java

Нужно расположить надписи и поля вот так:

144
Обращение к ключу массива через квадратные скобки

Обращение к ключу массива через квадратные скобки

Помогите разобраться почему такой код выдает true

282
Бесконечная анимация движения canvas

Бесконечная анимация движения canvas

Нужно, чтобы астероид пролетал за границы экрана и потом снова вылетал с другой стороныИ так по-кругу

110
React. Компоненты

React. Компоненты

Изучая react наткнулся на интересную с моей точки зрения конструкцию в react-bootstrap:

116