从 Java 调用 c++,然后从相同的 c++ 方法调用 java 方法

Call from Java to c++ and then from the same c++ method make a call to java method

本文关键字:方法 c++ 调用 java 然后 Java      更新时间:2023-10-16

下面的代码可以从Java调用C++方法。

JNITest.java

public class JNITest  {
    static {
        System.load("D:\gagan docs\TestJava\Example.dll");
    }
    public native int intMethod(int n);
    public static void main(String[] args) {
        JNITest jnitest = new JNITest();
        int square=jnitest.intMethod(5);
        System.out.println("HelloWorld");
        System.out.println("From init method"+square);
    }
}

示例.cpp

#include "JNITest.h"
#include<string.h>
JNIEXPORT jint JNICALL Java_JNITest_intMethod(JNIEnv *env, jobject obj, jint num)
{
    return num*num;
}

但是当我尝试使用以下方法从上述 CPP 调用 Java 方法时,JVM 崩溃了。

我也尝试过使用createJavaVM方法来创建JVM,但它崩溃了。

示例.cpp

#include "JNITest.h"
#include<string.h>
static JavaVM *jvm = NULL
JNIEXPORT jint JNICALL Java_JNITest_intMethod(JNIEnv *env, jobject obj, jint num) 
{
    JNIEnv* jenv;
    int res = jvm->AttachCurrentThread((void **)&jenv, NULL);
    return num*num;
}

我正在使用Linux(64位)机器和JDK 64位(Java 1.6)。

我想从Java -> C++ -> Java创建一个完整的流程。关于这个问题的任何信息都将非常有用。

从C++调用Java是一个(相对)简单的事情:

JNIEXPORT jint JNICALL Java_JNITest_intMethod(JNIEnv *env, jobject obj, jint num)
{
    jint x = (env)->CallIntMethod(obj, method_id);
    // or, (env)->CallVoidMethod(obj, voidMethod, ...), etc.
}

这假定jobject的类具有由 jmethodID 标识的方法。获取jmethodID也很简单:

jclass class_inst = (env)->FindClass("pkg/to/my/stuff/Class");
jmethodID method_id = (env)->GetMethodId(class_inst, "methodName", "()I");

获得您想要为特定课程调用的方法可能是您最具挑战性的任务,但一旦您很好地掌握了基础知识,就一点也不难了。

有关一个很好的例子(免责声明:我是示例的作者),请参阅 inotify-interface.cpp。

另请注意,您可能对调用 AttachCurrentThread 不感兴趣!