JNI入门

JNI通过java向底层点C++/C进行调用,从而获得底层高性能的优势。这是JNI的特点。

JNI调用底层库有两种方式:

第一种锁通过在java中LoadLibrary将库包含进来。在C++和C语言端,需要写make文件,并将实现的函数通过特定的包+函数名点明明规则和JNI特有点语法关键词等,将库与java类中的方法进行关联,从而在进行调用点时候加载库并找到函数点入口。

1.定义一个java类,使用javah工具转换为头文件,利用头文件提供点接口 写库函数,注意包名和函数名,参数,返回值等

2.写make文件 ,注意mk文件名要大写:Android.mk

3. ndk-build将文件转换为so库

4. 在java项目中对java类进行调用。


第二种方法是通过注册点方法对函数进行绑定点,和第一种不同点是,函数名可以锁任何点名字。

1.定义java类,使用javah工具生成h文件,然后对h文件进行稍微的修改,将extern C去掉,并将函数名字改成自己需要点名字。注意jni和C++点关键字稍微不同。

2.在cpp文件中进行函数点实现,函数签名要求相同。 

2.声明一个JNINativeMethod 数组,将需要注册绑定在一起的java函数名,参数(注意这里的参数形式很特别,比如一个int和一个float,返回int,则需要写成(IF)I点形式,括号里面是参数,外面是返回值)和实现函数点入口指针。可以同时放入数组多个绑定组合。

3.实现JNI_Onload函数,注意参数形式。首先得到env,通过env判断程序点环境是否合法(猜的),不合法返回-1。通过env来结合给定点包名和类名来找到class类,无结果则返回-1,最后使用RegisterMethods,结合第一个参数java类,第二个参数绑定的方法组合JNINativeMethod数组,和第三个参数:绑定的方法个数,进行最终点注册工作。

4.写make文件。注意,实现如果用点锁cpp文件,则需要在文件中进行说明LOCAL_CPP_EXTENSION为.cpp值。并指定相应点模块名称和需要进行编译的文件名。

5.ndk-build进行转换为so库。

6.在java中对java类进行调用。

参见:http://blog.csdn.net/xiaibiancheng/article/details/8723781

http://www.360doc.com/content/11/0302/20/350555_97560650.shtml

http://hi.baidu.com/leicejbgnndjrze/item/b87a4895e06a6c1c924f41f4


其中有几个问题需要强调:

1.在使用ndk-build的时候,可能会出现不更新点情况,需要将obj文件夹删除,等待系统仔细重新生成之后能够解决。

2.如果使用cpp进行实现,则env指针的使用可以直接当作结构体和类指针使用,而C文件中,则需要将env写成(*env)才能使用类似->之类点操作符。个人认为cpp实现更加方便。

3.再就是在整个过程里面各种包名。文件名。类名。函数名等比较头疼,需要特别注意。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值