Я перезваниваю на java из c ++ dll и CallVoidMethod вызывает EXCEPTION_ACCESS_VIOLATION. Чего мне не хватает - PullRequest
0 голосов
/ 07 января 2020

Среда
C ++ DLL, созданная с помощью Visual Studio 2017 Java программа, работающая под Intellij с использованием прилагаемого Java окружения

Когда я запускаю приложение java, я получаю сообщения std :: cout до сообщения обратного вызова Затем система останавливается

Когда я присоединяю отладчик в Visual Studio, я получаю нарушение прав доступа по адресу 0x0 ... 0240

Что-то в CallVoidMethod неверно, но я не уверен что. До сих пор мне не удалось найти ответы, которые применимы к этому простому делу в Интернете.

Код

JAVA

public class Main {
    public native void executeNativeCode();
    static {
        System.loadLibrary("JNITarget" );
    }
    // write your code here
    public static void main(String[] args) {
        new Main().executeNativeCode();
        System.out.println("Java Done");
    }

    public void helloWorld() {
        System.out.println("Hello World from Java!");
    }


 }

C ++

// JNITarget.cpp : Defines the exported functions for the DLL application.
//

//#include "stdafx.h"
#include <iostream>
#include <string>
#include "jni.h"
#include "com_poc_Main.h"
#include "JNITarget.h"

JNIEXPORT void JNICALL Java_com_poc_Main_executeNativeCode(JNIEnv * env, jobject thisObj) {
    std::cout << "Hello World from C++!" << std::endl;

    std::cout << "Get java class object" << std::endl;
    jclass thisClass = env->GetObjectClass(thisObj);
    std::cout << "Get callback method" << std::endl;
    jmethodID callback = env->GetMethodID(thisClass, "helloWorld", "()V");
    std::cout << "Call callback method" << std::endl;
    env->CallVoidMethod(thisClass, callback);
    std::cout << "C++ done" << std::endl;

    return;
}```

1 Ответ

0 голосов
/ 07 января 2020

Хорошо, для всех, кто сталкивается с этим, изменение аргументов CallVoidMethod на

env->CallVoidMethod(thisObj, callback)

вместо

env->CallVoidMethod(thisClass, callback) 

решает проблему

...