Android(安卓)JNI实例代码(一)
16lz
2021-01-25
前几天有关Android JNI开发系列教程中有关的源代码,可以在本文中查找:
一、 在JNI中执行Java方法
[java] view plain copy- classAndroidJniDemo{
- privatenativevoidexecuteMethod();
- privatevoidshow(){
- System.out.println("Javacwjprint");//执行了show方法后打印java层的输出
- }
- publicstaticvoidmain(Stringargs[]){//这里我们在J2SE中测试,Android开发者可以放到Activity中的onCreate调用
- AndroidJniDemoajd=newAndroidJniDemo();
- ajd.executeMethod();
- }
- static{
- System.loadLibrary("AndroidJniDemo");
- }
- }
下面是JNI代码:
[cpp] view plain copy- JNIEXPORTvoidJNICALL
- Java_AndroidJniDemo_executeMethod(JNIEnv*env,jobjectobj)
- {
- jclassclazz=(*env)->GetObjectClass(env,obj);//通过类的对象
- jmethodIDmid=(*env)->GetMethodID(env,clazz,"show","()V");//查找java中的show方法的ID,最后的签名符号为void类型
- if(mid==NULL){
- return;//如果方法ID没有找到
- }
- printf("JNIcwjprint");//从JNI中打印输出
- (*env)->CallVoidMethod(env,obj,mid);//执行show方法
- }
二、获取/设置类的域或者说属性字段
(1 String类型的属性读写
[java] view plain copy- classAndroidJniDemo2{
- privateStringsTmp;
- privatenativevoidreadwriteField();
- publicstaticvoidmain(Stringargs[]){
- AndroidJniDemo2ajd2=newAndroidJniDemo2();
- ajd2.sTmp="cwj";
- ajd2.readwriteField();
- System.out.println("Javacwjprint="+ajd2.sTmp);//java层打印结果
- }
- static{
- System.loadLibrary("AndroidJniDemo2");
- }
- }
下面是JNI层代码:
[cpp] view plain copy- JNIEXPORTvoidJNICALL
- Java_AndroidJniDemo2_readwriteField(JNIEnv*env,jobjectobj)
- {
- jfieldIDfid;
- jstringjstr;
- constchar*szTemp;
- jclassclazz=(*env)->GetObjectClass(env,obj);
- fid=(*env)->GetFieldID(env,clazz,"sTmp","Ljava/lang/String;");//注意sTmp是Java中声明的,String类型在java.lang.String包中,签名符号的格式注意
- if(fid==NULL){
- return;
- }
- jstr=(*env)->GetObjectField(env,obj,fid);//Java的String类型,要用GetObjectField函数获取,这里Android123提示大家没有GetStringField这样的函数在JNI中,或者说在C语言中
- szTemp=(*env)->GetStringUTFChars(env,jstr,NULL);//因为还需要赋值,在C中我们转换为utf8的类型。
- if(szTemp==NULL){
- return;
- }
- printf("JNIcwjprint=%s",szTemp);//先打印Java层传进来的值
- (*env)->ReleaseStringUTFChars(env,jstr,szTemp);//szTemp打印完不用了要及时释放掉
- jstr=(*env)->NewStringUTF(env,"android123");//返新的字段值,供Java层打印
- if(jstr==NULL){
- return;
- }
- (*env)->SetObjectField(env,obj,fid,jstr);//设置新的属性值。
- }
(2 int或double类似的类型的属性读写,本例同时属性值是一个静态的定义,注意下面加粗的static关键字
[java] view plain copy- classAndroidJniDemo3{
- privatestaticintsAge;
- privatenativevoidreadwriteField();
- publicstaticvoidmain(Stringargs[]){
- AndroidJniDemo3ajd3=newAndroidJniDemo3();
- AndroidJniDemo3.sAge=23;
- ajd3.readwriteField();//执行jni层
- System.out.println("Javacwjprint="+sAge);//java层打印新的值,应该为120
- }
- static{
- System.loadLibrary("AndroidJniDemo3");
- }
- }
下面是JNI层代码:
[cpp] view plain copy- JNIEXPORTvoidJNICALL
- Java_AndroidJniDemo3_readwriteField(JNIEnv*env,jobjectobj)
- {
- jfieldIDfid;
- jintnTemp;
- jclassclazz=(*env)->GetObjectClass(env,obj);
- fid=(*env)->GetStaticFieldID(env,clazz,"sAge","I");//因为是整形,这里签名符号为I,注意使用的函数中包含Static代表是一个静态的属性
- if(fid==NULL){
- return;
- }
- nTemp=(*env)->GetStaticIntField(env,clazz,fid);
- printf("JNIcwjprint=%d",nTemp);//这里应该显示23
- (*env)->SetStaticIntField(env,clazz,fid,120);//设置新的值为120,注意包含了Static,java层中定义的sAge是静态的。
- }
给出了较完整的JNI下执行Java的源代码第一部分,有关第二部分可以查看 Android JNI实力代码(二)
更多相关文章
- Android中级篇之区分系统程序和安装程序
- android Service理解
- Android(安卓)Bitmap内存限制
- android AIDL简单步骤
- Android(安卓)百分比布局详解及实例代码
- Android(安卓)利用soap协议与服务端进行通信
- Android(安卓)Studio gradle配置详解
- Android在标准linux基础上对休眠唤醒的实现(一)(二)(三)【转】
- 【工作总结】一键清理总结