java交叉编译安卓可用,使用NDK实现Android中C与Java交叉编译

本文介绍了如何在Android应用中通过JNI(Java Native Interface)和NDK(Native Development Kit)实现C代码与Java的高效集成,包括环境搭建、C接口函数定义、H文件生成、C程序编写、Android.mk配置、动态库编译和应用测试,以优化大数乘法等场景的性能。
摘要由CSDN通过智能技术生成

android中的java依托于java虚拟机,运行效率是比较低的,最近在做高效大数乘法中,发现了JNI或者NDK可以实现C与Java混编,并且引用c的动态库,而且android中的C语言不需要依托java虚拟机,效率还是非常高的。

一、开发环境的搭建

开发java的话还是eclipse不变,除此之外下载android-ndk-r9d-linux-x86_64.tar.bz2(linux),安装方法:

$ cd android-ndk-r9d/

$ build/tools/make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-4.8 --platform=android-19 --system=linux-x86_64 --install-dir=$HOME/android-19-arm或许要为其添加环境变量,以便直接使用。其他linux/unix系统类似,这儿不赘述了。

二、开发过程

整个过程总体是 在java中声明与C的接口函数 -> javah命令导出.h的头文件 -> 编写c程序 -> 编写Android.mk -> 使用ndk-build编译C程序为动态库文件 -> android编译

1、java中生命C接口函数

public class func {

static{

System.loadLibrary("cfunc");// 预引用库(前不写lib后不写.so)

}

private native String jni_say();// 声明C程序中的接口函数

}

2、导出.h头文件

利用终端进入工程目录,进入 /bin/classes

使用javah + 包名 + 类名 导出头文件

会看到当前目录下多了一个.h文件

c41b41b7c486028f362e83d7bb4b8cc0.png

f7c328663b97b499c76565edbfc2970b.png

3.编写c程序

首先在工程根目录下建一个名为“jni”的文件夹,将上步生成的.h文件复制过来,根据.h编写.c/.cpp即可

0c4a22f2035f9910f1d9b6528f8bd7e7.png

接口中的数据类型与c/c++不太一样,需另外学习下,其他的函数中,就一模一样了。

可参考:http://blog.sina.com.cn/s/blog_5de73d0b0101chk1.html

4.编写Android.mk

e5ef151313113182613d77cc7d34b2ea.png

详情可参考 http://www.2cto.com/kf/201310/253386.html

5、使用ndk-build将c代码编译成动态库

直接在jni目录下使用ndk-build命令即可

ee1b467e1b1209aaf17593ee46fb666d.png

这时,F5刷新一下,就能发现在android工程目录下的libs中会多一个armeabi文件夹,里面就是生成的动态库。

e1dd831fad57b716ec3db410b00b309b.png

6、编写测试程序,Android端编译工程,运行调试

注意,jni项目只能采用真机测试,模拟器是跑不了的。

ba4a0c7ba3869e11d9700e21cb9ca395.png

三、引用C语言库

代码写法与c语言相同,主要是要修改Android.mk来实现编译。具体参照上面提供的网址。

其它可参考资料:

http://zzbupt.iteye.com/blog/1876496nd

ndk-build的用法:http://blog.csdn.net/smfwuxiao/article/details/8523087

原文:http://blog.csdn.net/tbl_123/article/details/39460287

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值