当前位置: 首页 > 面试题库 >

JNI在C和C ++中的调用不同吗?

吴高洁
2023-03-14
问题内容

所以我在C中使用了Java本机接口的以下代码,但是我想将其转换为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 ++交互的区别是什么?任何帮助是极大的赞赏。

谢谢,皮特


问题答案:

我曾经有一本书《EssentialJNI》。虽然它有些过时,但今天仍然可以使用。

如果我没记错的话,在C语言中,Java构造只是指针。因此,在您的代码中,“ (*env)->”是取消引用指针,以使您可以访问基础方法。

对于C ,“ env”实际上是一个对象-与C指针不同的实体。(由于C 实际上支持对象,因此JNI实际上可以为您的C
代码提供实际的对象进行操作。)因此“ env->”在C 中具有不同的含义,它意味着“调用” env“所指向的对象中包含的方法。

我相信另一个不同之处是,许多C-JNI函数要求您的参数之一是“ JNIEnv *env”。因此,在C中您可能不得不说(*env)->foo(env, bar)。使用c ++时,env不需要第二次引用“ ”,因此您可以说“ env->foo(bar)

不幸的是,我眼前没有上述书,所以我无法完全确认!但是我认为,对这两件事进行调查(特别是在google或其他JNI代码中寻找它们)将使您走得更远。



 类似资料:
  • 我正在制作一个库应用程序,该应用程序使用谷歌断路器检测android中的本机崩溃。每当我的主端发生本机崩溃时,断路器都会调用以下回调。从这个回调中,我需要使用JNI在java类中调用一个静态val方法。 这是我的java方法: 在Android5.0之前,这一功能一直运行良好。但在Lollipop中,我无法调用我的java方法,因为我无法在Logcat控制台上看到“内部句柄异常”日志。 以下是我在

  • 这么小的问题,出于性能原因,我一直在研究将我的C#代码的一部分移动到C。现在当我看着我的花车。εC#它的值不同于我的C值。 在C#中,微软描述的值为1.401298E-45。 在C中的值,如所述的cp首选项是1.19209e-07; 在这两种语言中,浮点/单数的最小可能值怎么可能不同? 如果我是正确的,二进制值在字节数方面应该相等,甚至可能是它们的二进制值。还是我看错了? 希望有人能帮助我,谢谢!

  • 问题内容: 虽然我可以使用Java代码的Eclipse JDT调试器和C代码的GDB调试应用程序,但我还是希望使用单个工具进行所有调试。我找到了几个在Eclipse中启用“混合模式”调试的项目,其中包括对Java和本机代码之间的单步执行的支持。 英特尔针对Java / JNI环境的集成调试器 Mariot Chauvin的“代码之夏”项目:支持JDT和CDT之间的无缝调试 不幸的是,其中一个声称是

  • 情境:我有一个实现了JNI的dll,我想从一个Cpp应用程序调用其中的方法。 当前状态:根据我的理解,一个实现了JNI的dll实际上与JAVA无关,例如:在test.JAVA中,我编写了 并在testdll.cp 我认为这样的程序与JVM无关,jint结构似乎已经在JNI.h中完全定义了。 因此,我想知道是否可以直接调用而不从Cpp应用程序创建VM,如果可以,请: 参数列表中的`jnienv*`和

  • 问题内容: 因此,我正在编写一个使用大型c 库的Android应用。我可以正常工作,以便Java应用程序可以调用c 委托方法,但是我发现自己希望自己可以将来自c 的消息记录到Android日志中。从Java上这很容易,但是我不知道如何从c 调用Java方法。我的搜索找到了从c 打开jvm的方法,这根本不是我想要做的。理想情况下,我想将日志方法指针传递给c ,然后可以在需要时使用它。当然,Java不

  • 本文向大家介绍浅谈C/C++中指针和数组的不同,包括了浅谈C/C++中指针和数组的不同的使用技巧和注意事项,需要的朋友参考一下 这边先简单介绍一下内存分区。 内存按照用途划分为五个区: 1.栈区:由系统控制分配和回收。 例如定义变量 int x = 0; int *p = NULL; 变量所占的内存都是分配在栈区的。 2.堆区:由程序员管理。 在C语言中由 malloc 申请的内存,或者在C++中