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

标签 java c++ c java-native-interface

所以我在 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/

相关文章:

java - 我将如何使用系统剪贴板从 java 中粘贴?

c++ - 为 X 毫秒数创建一个 boost::posix_time::ptime 实例

c - 内联汇编中的乘法指令错误

c++ - 使用 C API 的有序 lua 表循环

c - 是否可以创建一个用 C 语言读取半个文本文件的函数?

android - 在 Android 6.0 上读取 Elf32 的 PT_DYNAMIC 条目时出现内存访问错误

java - SaveOrUpdate 时出现唯一约束冲突错误

java - Ide CLASSPATH 与系统范围的 CLASSPATH

java - Intellij IDEA 2020.1 将资源复制到包输出

c++ - 如何在 C++ 中返回一个列表