前几天有关Android JNI开发系列教程中有关的源代码,可以在本文中查找:

一、 在JNI中执行Java方法

[java] view plain copy
  1. classAndroidJniDemo{
  2. privatenativevoidexecuteMethod();
  3. privatevoidshow(){
  4. System.out.println("Javacwjprint");//执行了show方法后打印java层的输出
  5. }
  6. publicstaticvoidmain(Stringargs[]){//这里我们在J2SE中测试,Android开发者可以放到Activity中的onCreate调用
  7. AndroidJniDemoajd=newAndroidJniDemo();
  8. ajd.executeMethod();
  9. }
  10. static{
  11. System.loadLibrary("AndroidJniDemo");
  12. }
  13. }

下面是JNI代码:

[cpp] view plain copy
  1. JNIEXPORTvoidJNICALL
  2. Java_AndroidJniDemo_executeMethod(JNIEnv*env,jobjectobj)
  3. {
  4. jclassclazz=(*env)->GetObjectClass(env,obj);//通过类的对象
  5. jmethodIDmid=(*env)->GetMethodID(env,clazz,"show","()V");//查找java中的show方法的ID,最后的签名符号为void类型
  6. if(mid==NULL){
  7. return;//如果方法ID没有找到
  8. }
  9. printf("JNIcwjprint");//从JNI中打印输出
  10. (*env)->CallVoidMethod(env,obj,mid);//执行show方法
  11. }

二、获取/设置类的域或者说属性字段

(1 String类型的属性读写

[java] view plain copy
  1. classAndroidJniDemo2{
  2. privateStringsTmp;
  3. privatenativevoidreadwriteField();
  4. publicstaticvoidmain(Stringargs[]){
  5. AndroidJniDemo2ajd2=newAndroidJniDemo2();
  6. ajd2.sTmp="cwj";
  7. ajd2.readwriteField();
  8. System.out.println("Javacwjprint="+ajd2.sTmp);//java层打印结果
  9. }
  10. static{
  11. System.loadLibrary("AndroidJniDemo2");
  12. }
  13. }

下面是JNI层代码:

[cpp] view plain copy
  1. JNIEXPORTvoidJNICALL
  2. Java_AndroidJniDemo2_readwriteField(JNIEnv*env,jobjectobj)
  3. {
  4. jfieldIDfid;
  5. jstringjstr;
  6. constchar*szTemp;
  7. jclassclazz=(*env)->GetObjectClass(env,obj);
  8. fid=(*env)->GetFieldID(env,clazz,"sTmp","Ljava/lang/String;");//注意sTmp是Java中声明的,String类型在java.lang.String包中,签名符号的格式注意
  9. if(fid==NULL){
  10. return;
  11. }
  12. jstr=(*env)->GetObjectField(env,obj,fid);//Java的String类型,要用GetObjectField函数获取,这里Android123提示大家没有GetStringField这样的函数在JNI中,或者说在C语言中
  13. szTemp=(*env)->GetStringUTFChars(env,jstr,NULL);//因为还需要赋值,在C中我们转换为utf8的类型。
  14. if(szTemp==NULL){
  15. return;
  16. }
  17. printf("JNIcwjprint=%s",szTemp);//先打印Java层传进来的值
  18. (*env)->ReleaseStringUTFChars(env,jstr,szTemp);//szTemp打印完不用了要及时释放掉
  19. jstr=(*env)->NewStringUTF(env,"android123");//返新的字段值,供Java层打印
  20. if(jstr==NULL){
  21. return;
  22. }
  23. (*env)->SetObjectField(env,obj,fid,jstr);//设置新的属性值。
  24. }

(2 int或double类似的类型的属性读写,本例同时属性值是一个静态的定义,注意下面加粗的static关键字

[java] view plain copy
  1. classAndroidJniDemo3{
  2. privatestaticintsAge;
  3. privatenativevoidreadwriteField();
  4. publicstaticvoidmain(Stringargs[]){
  5. AndroidJniDemo3ajd3=newAndroidJniDemo3();
  6. AndroidJniDemo3.sAge=23;
  7. ajd3.readwriteField();//执行jni层
  8. System.out.println("Javacwjprint="+sAge);//java层打印新的值,应该为120
  9. }
  10. static{
  11. System.loadLibrary("AndroidJniDemo3");
  12. }
  13. }

下面是JNI层代码:

[cpp] view plain copy
  1. JNIEXPORTvoidJNICALL
  2. Java_AndroidJniDemo3_readwriteField(JNIEnv*env,jobjectobj)
  3. {
  4. jfieldIDfid;
  5. jintnTemp;
  6. jclassclazz=(*env)->GetObjectClass(env,obj);
  7. fid=(*env)->GetStaticFieldID(env,clazz,"sAge","I");//因为是整形,这里签名符号为I,注意使用的函数中包含Static代表是一个静态的属性
  8. if(fid==NULL){
  9. return;
  10. }
  11. nTemp=(*env)->GetStaticIntField(env,clazz,fid);
  12. printf("JNIcwjprint=%d",nTemp);//这里应该显示23
  13. (*env)->SetStaticIntField(env,clazz,fid,120);//设置新的值为120,注意包含了Static,java层中定义的sAge是静态的。
  14. }

给出了较完整的JNI下执行Java的源代码第一部分,有关第二部分可以查看 Android JNI实力代码(二)

更多相关文章

  1. Android中级篇之区分系统程序和安装程序
  2. android Service理解
  3. Android(安卓)Bitmap内存限制
  4. android AIDL简单步骤
  5. Android(安卓)百分比布局详解及实例代码
  6. Android(安卓)利用soap协议与服务端进行通信
  7. Android(安卓)Studio gradle配置详解
  8. Android在标准linux基础上对休眠唤醒的实现(一)(二)(三)【转】
  9. 【工作总结】一键清理总结

随机推荐

  1. Bitmap 的加载和 Cache
  2. android中的常见类(2)
  3. 【转】Android(安卓)9 Pie 兼容性常见问
  4. Android使用FtpServer开启FTP服务端
  5. Android中传递对象的三种方法的实现
  6. 分析Activity的View绑定过程
  7. Android中优雅的退出程序
  8. 【Android】获得系统语言和地区
  9. Android轻松实现多语言的方法示例
  10. Android(安卓)1.5 在eclipse中出现 Inter