所以我在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)->”是取消引用指针,以使您可以访问基础方法。
(*env)->
对于C ,“ env”实际上是一个对象-与C指针不同的实体。(由于C 实际上支持对象,因此JNI实际上可以为您的C 代码提供实际的对象进行操作。)因此“ env->”在C 中具有不同的含义,它意味着“调用” env“所指向的对象中包含的方法。
env
env->
我相信另一个不同之处是,许多C-JNI函数要求您的参数之一是“ JNIEnv *env”。因此,在C中您可能不得不说(*env)->foo(env, bar)。使用c ++时,env不需要第二次引用“ ”,因此您可以说“ env->foo(bar)”
JNIEnv *env
(*env)->foo(env, bar)
env->foo(bar)
不幸的是,我眼前没有上述书,所以我无法完全确认!但是我认为,对这两件事进行调查(特别是在google或其他JNI代码中寻找它们)将使您走得更远。