gpt4 book ai didi

java - C 和 C++ 中的 JNI 调用不同?

转载 作者:IT老高 更新时间:2023-10-28 12:41:35 27 4
gpt4 key购买 nike

所以我在 C 中有以下代码,它使用了 Java 原生接口(interface),但是我想将其转换为 C++,但不知道如何。

 #include <jni.h>
#include <stdio.h>
#include "InstanceMethodCall.h"

JNIEXPORT void JNICALL
Java_InstanceMethodCall_nativeMethod(JNIEnv *env, jobject obj)
{
jclass cls = (*env)->GetObjectClass(env, obj);
jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "()V");
if (mid == NULL) {
return; /* method not found */
}
printf("In C\n");
(*env)->CallVoidMethod(env, obj, mid);
}

Java 程序:

 class InstanceMethodCall {
private native void nativeMethod();
private void callback() {
System.out.println("In Java");
}
public static void main(String args[]) {
InstanceMethodCall c = new InstanceMethodCall();
c.nativeMethod();
}
static {
System.loadLibrary("InstanceMethodCall");
}
}

JNI 与 C 和 C++ 交互的区别是什么?非常感谢任何帮助。

谢谢,皮特

最佳答案

我以前有书Essential JNI .虽然它有点过时了,但其中大部分在今天仍然有效。

如果我没记错的话,在 C 语言中,Java 构造只是指针。因此,在您的代码中,"(*env)->"正在取消引用指针以使您能够访问底层方法。

对于 C++,“env”实际上是一个对象——与 C 指针不同的实体。 (而且 JNI 实际上可以为您的 C++ 代码提供真实的对象来操作,因为 C++ 实际上支持对象。)所以“env->”在 C++ 中具有不同的含义,它的意思是“调用包含在“env”指向的对象中。

我认为,另一个区别是许多 C-JNI 函数要求您的参数之一是“JNIEnv *env”。所以在 C 中你可能不得不说 (*env)->foo(env, bar)。在 c++ 中,不需要第二次引用“env”,因此您可以改为说“env->foo(bar)

很遗憾,我面前没有上面的书,所以我不能完全确认这一点!但我认为调查这两件事(特别是在 google 或其他 JNI 代码中寻找它们)会让你走得很远。

关于java - C 和 C++ 中的 JNI 调用不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/935379/

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