前言
上一篇我们介绍了《Android NDK编程(三)--- Android调用C的函数》,主要是介绍了在Android中怎么调用C/C++中的方法,在我们开发ndk的时候有可能会用到在c/c++代码中回调JAVA中的方法,这一章我们就来介绍一下C/C++中怎么调用Android中的方法。
调Java方法
代码演示之前,这里要重点说出一下C/C++调用JAVA的方法步骤:
Android中Jni可以通过FindClass,GetMethodID, CallObjectMethod等可以实现对java中方法的调用。
GetMethodID中最后一个参数的写法很特殊,
Jni中GetMethodID的定义:
jmethodID GetMethodID(jclass clazz, const char* name, const char* sig)
第一个参数:JNI接口对象;
第二个参数:Java类对象;
第三个参数:参数名(或方法名);
第四个参数:该参数(或方法)的签名。
其中第一个参数方法的签名对照表如下:
例子:
public void demo1(int a,int b){} //(II)V
public void demo2(String a){} //(Ljava/lang/String;)V
public void demo3(String [] arr){}//([Ljava/lang/String;)V
public int demo4(){return 0;}//()I
public boolean demo5(){return false;} //()Z
public String demo6(String [] a){ return "";}//([java/lang/String;)Ljava/lang/String;
public String[] demo7(){return null;}//()Ljava/lang/String;
public void demo8(String[] a,String[] b){}//([Ljava/lang/String;[Ljava/lang/String;)V
public void demo8(String[] a,int b){}//([Ljava/lang/String;I)V
public void demo9(int[] a,int b){}//([II)V
//内部类
// "(Ljava/lang/String;com/ldx/Demo$DemoInnter;)Z"
!
代码演示
还是接着我们一直用的Demo,这次我们先在Java中写一个ShowText的方法,再定义一个native的方法用于调用,如下图
然后在native-cpp下开始写代码
extern "C"
JNIEXPORT void JNICALL
Java_dem_vac_vaccaendk_MainActivity_showtextFromJNI(JNIEnv *env, jobject instance) {
//查找方法所在的类
//获取jclass
jclass jcls=env->GetObjectClass(instance);
if (jcls == NULL) {
return;
}
//获取方法ID
jmethodID jmethod=env->GetMethodID(jcls,"ShowText","()V");
if (jmethod == NULL) {
return;
}
//调用方法
env->CallVoidMethod(instance,jmethod);
}
然后我们把按钮事件改一下
重新运行程序后显示的界面
我们再增加一个带参数的方法进行处理
然后修改一下我们C/C++里面的那个方法,主要就是修改获取方法的参数
修改后的参数为下图,左上角红框修改了方法参数,然后定义了一个新的字符串,在调用方法的时候把这个参数也输入进去
接下来我们运行程序后点击按钮
-END-
Vaccae的往期经典
OpenCV
Android
《Android利用SurfaceView结合科大讯飞修改语音实别UI》
《Android关于语音识别的功能实现分析(一)---结构化思维》
《Android关于语音识别的功能实现分析(二)---语义解析》
.Net C#
数据库及其它
长按下方二维码关注微卡智享