gpt4 book ai didi

java - 从 Java 调用到 C++,然后从同一个 C++ 方法调用 Java 方法

转载 作者:太空宇宙 更新时间:2023-11-04 12:04:17 25 4
gpt4 key购买 nike

以下代码可以从 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 !

关于java - 从 Java 调用到 C++,然后从同一个 C++ 方法调用 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12863401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com