Andriod JNI编程之C++回调Java函数

时间:2025-04-23 07:50:06

一般我们NDK编程都是Java层调用C++的接口,但其实才C++层也可以调用Java的函数。实现方法如下:

1、获取类名:jclass cls = env->FindClass

2、获取类方法:jmethodID mid = env->GetMethodID

3、获取类成员变量:fieldID fid=env->GetFieldID

4、生成类对象:jobject obj=env->NewObject (jobect也可以从Java层传下来)

5、调用类成员方法:env->CallXXXMethod(XXX为Java方法的返回值类型)

 

下面是一个例子:

首先是Java的代码,首先生成一个JniTest类,里面有个sayHelloFromJava的方法,我们要实现的目标是在C++里面赋值(String str),两个整形值(int index1,  int index2),一个整形数组(int[] intArray),然后在Java里面将这些数值打印出来。

 

 

然后是C++里面的代码

通过这个例子我们基本上就可以了解C++层是如何回调Java函数的了。另外,这里还有一个小技巧,如果你不知道你Java层的在C++中的类型是什么,你可以native方法中将这个类型写进去,然后用javah方法生成.h文件,只要查看.h文件的对应的类型注释就可以知道结果了。例如:我们想知道String、整形数组对应的类型怎么写,我们在native中加入一个public native void type(String str, int[] arrayInt)方法

然后生成对应的.h文件:

我们注意看注释中的“Signature: (Ljava/lang/String;[I)V”,其中Ljava/lang/String;Ljava/lang/String;就是String的类型(注意分号不能丢),[I则是整形数组对应的类型。