注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

Android系列四复杂动态库之自定义对象传递  

2013-03-27 18:49:52|  分类: Android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Android系列四复杂动态库之自定义对象传递

接着上回的说,这里有两个细节需要说明一下,一个是大家在看导入的NDK的自己的工程的时候,会有一个Application.mk这个文件,但在自己新建工程的时候儿是可以不建立的,如果没有建立就会使用默认的ANDROID自带的。第二个是在mk文件中,不用再像makefile文件中一样用tab进行缩进了。后者方便了许多。

继续说代码。

今天主要说一下如何传递对象,大家在编程的时候,经常会传递一些对象,可能是结构体也可以能是类,看大家的应用环境了,所以说,解决JAVA把类对象传递到JNI中,是一个非常迫切的需要解决的问题,同时为了达到公用的目的,把JNI类的封装拿到一个单独的类中,也就是说在JAVA中封装一个类。

例如在JAVA中定义一个类IrisLib.java来封装如下:

public class IrisLib {

         public native int GetIntData(InfoImage data);

}

Class InfoImage{

Public int height;

Public int wdith;

}

重新用javah –classpath bin\classes –d jni com.example.mytestso.MyTestSo生成头文件,然后生成c文件。

JNIEXPORT jint JNICALL Java_com_example_mytestso_IrisLib_GetIntData 

(JNIEnv *env, jobject this,jobject obj)
{

Jint a,b;
    jclass cls = (*env)->GetObjectClass(env,obj);
    if (cls)
    {
     //
设置当前的数据值
     //INT
类型
     jfieldID fnumid  = (*env)->GetFieldID(env,cls,"height","I");
     a = (int)(*env)->GetIntField(env,obj,fnumid);


     fnumid  = (*env)->GetFieldID(env,cls,"width","I");
    b = (int)(*env)->GetIntField(env,obj,fnumid);

 

         //设置当前值

(*env)->SetDoubleField(env,obj,fnumid,dScore);

 

}

return a+b;
}

这时还要把android.mk这个makefile修改一下,换个名字就可以了。然后保存,ECLIPSE会自动进行编译。

运行就可以了。前面的的界面中会显示出结果。

努力,为了幸福的长久。

  评论这张
 
阅读(480)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017