如何在Windows环境下进行jni开发--NDK环境配置

ndk编程(native developer kit),关于jni(java native interface)这方面的使用,其实早在2014年的时候,就研究过这方面的知识,只是当时工作上用不到所以就没对这方面进行一个汇总! 近期由于个人维护Android平台中间件要涉及到这方面的知识,那么今天将结合个人工作对这部分知识体系进行一个总结,个人工作上的有关jni编写是基于Linux系统平台下的,这个比在Windows下进行NDK开发更加方便简捷。

环境搭建

首先再搭建Windows下的NDK开发环境时,先回顾一些重要的知识点:

NDK开发, 简单点理解 , 其实就是用我们的C/C++编写一个本地库函数供java调用或者回调java端的接口,去做一个java端无法做的事! 实现跨一个平台操作

我们的java,或者C/C++,由写代码到可运行的软件或者函数库时需要经过两个步骤:
1 编译阶段
2 连接阶段

Java文件编译阶段之后生成 .class文件 ,连接阶段的工作交由java的虚拟机处理完成
如果虚拟机是在Windows下,则会去模拟一个Windows环境去解析完成java编译阶段之后的字节码.class文件
如果虚拟机是在Linux下,则会去模拟一个Linux环境去解析完成java编译阶段之后的字节码文件

C代码跟java代码有所差异,在C文件编译阶段之后生成 .0中间文件,在Windows下连接生成.exe文件,linux下生成.elf文件

.exe是windows下可执行文件
.elf是linux下可执行文件

windows下C语言打包成的函数库.dll
linux下C语言打包成的函数库.so动态库或者静态库.a .ko等多种方式

众所周知,我们我们Android底层用的操作系统就是Linux操作系统,其实Linux就是C,那么由于厂商不同,那么定制方式就会不同,对应的一些C代码还是有区别的,手机底层Linux操作系统有些是基于arm处理器cpu(这个目前是主流cpu) ,有些就会是基于x86处理器cpu(例如联想手)但是这类处理器兼容性差有些软件可能会跑不起来

那么问题来了!我们需要在windows下的环境 把我们的c代码打包成 手机能用的函数库 .so 而不是.dll 该怎么办?那么我们可以在Windows下去模拟一个Linux环境出来,这边需要用到几个辅助工具:

android-ndk-r8c点击下载

工具点击下载

1、NDK (去Google官网下载最新的NDK) 解压到系统某个盘符下,但是路径不要有中文 (我们要在Windows下进行NDK开发就必须要有自己配置的ndk环境)

这里写图片描述

下载下来是上面这个样子,个人这边目前用的是r8这个版本,目录介绍:
build—编译目录(里面存放很多Linux下的.sh批处理文件,.sh是linux下的批处理文件,也称shell脚本,如果对这方面还不是熟悉的同学请移步至 Linux shell 脚本编写 作个简单的理解,.bat是windows下的批处理文件。由于ndk有很多linux的批处理文件,所以最早的NDK开发是基于linux平台系统下开发的(国外Windows系统收费,在中国特殊国情)国外多数NDK开发是基于这个Linux下开发 )
samples—案例demo
docs—开发文档参考
test—测试目录
platforms—平台 一般基于8版本开发 这个版本是比较稳定的版本

这里写图片描述

这里写图片描述

ndk环境变量配置(需要配置两处),以下是博主个人的环境变量配置:
这里写图片描述

%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;E:\eclipse_adt_bundlece\sdk\platform-tools;F:\Git\Git\cmd;F:\svn\bin;F:\QuickTime Alternative\QTSystem;D:\Program Files (x86)\Java\jdk1.7.0_79\bin;C:\MinGW\bin;E:\android-ndk-r8c

这里写图片描述

NDK_HOME
E:\android-ndk-r8c

在命令行输入ndk-build弹出下面的信息说明配置无误:

这里写图片描述

2、 cygdriver 模拟linux系统环境

由于在Windows下进行ndk开发,执行ndk指令以及打包出来的函数库会出现一些问题,所以我们还需要另外一个工具去模拟Linux环境,下面说一下这个工具的安装使用:

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

还有一点要注意的是:安装时我们只需要添加以下两项包数据为install就可以了
devel install 和 shell install

这里写图片描述

安装成功之后,会在桌面上出现这么一个图标;
这里写图片描述

linux会把所有设备都生成了一个文件,我们在这个工具中cd到根目录看看这个模拟Linux环境的文件目录跟我们手机上的差异:

这里写图片描述

这里写图片描述

从上来面来看,模拟的跟真实手机上的多少来说有一点差异,手机上的Linux文件目录结构要比模拟的要多那么些文件,另外这个模拟的Linux环境文件结构跟这个工具安装时关联的本地文件里的文件结构是一样的。

3、cdt(c/c++ developer tools)
为了方便在eclipse或者其它开发工具中开发c/c++代码, 让c/c++代码高亮显示我要用到这个cdt插件,如果你的C/C++用得相当得纯熟,这个工具是多余的!这边以安装到eclipse为例:

打开eclipse的顶部菜单栏help->install new software执行以下操作即可:

这里写图片描述

这里写图片描述

Eclipse添加CDT C/C++开发插件
Windows下为 Eclipse 配置 C/C++ 编译环境
Eclipse CDT配置

1.) 在项目根目录下创建jni目录,下面是要放进去的第一个文件Android.mk LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := main_jni #LOCAL_CFLAGS := LOCAL_SRC_FILES := main.cpp #LOCAL_LDLIBS := include $(BUILD_SHARED_LIBRARY) 2.) 在jni目录创建main.cpp #include using namespace std; #ifdef __cplusplus extern "C" { #endif class Test { public: Test(){}; ~Test(){}; int SomeFunc() { return 20140522; } }; jint Java_com_yxiaolv_testjni_MainActivity_SomeFunc(JNIEnv *env, jobject thiz) //红色部分必须和你java类包名一致 { Test *test = new Test(); return test->SomeFunc(); } #ifdef __cplusplus } #endif //将下面第3.)至第5.)步的代码片段放到eclipse创建android项目时自动产生的MainAcitivity.java中就可以了 3.) 在Java Activity代码中添加对这个jni的调用 (本例中是MainActivity.java ): static { System.loadLibrary("main_jni"); } 4.) 在调用者Activity中定义函数 native int SomeFunc(); 5.) 在activity中调用 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = new TextView(this); int i = SomeFunc(); tv.setText( String.valueOf(i) ); setContentView(tv); } //下面的第6.)和第7.)步可以被集成的.cproject 和在.project中添加plugin之后一键编译,不用单独起dos窗口了。由于没有找到生成.cproject的工具,只能手写,所以本文不使用该方法,以后找到了好的方法再补充。委屈 6.) 在dos窗口中,cd到项目路径下,运行ndk-build 命令,该命令会自动搜索该路径子目录下的native项目,进行编译。 (Note: 编译完成后不要忘记了刷新项目)。 7.) 重新编译和部署项目,就可以看到已经包含了.so的apk运行在目标机上了。 摘自 http://stackoverflow.com/questions/13654678/how-compile-c-project-via-android-ndk 1). 如果不知道怎样安装和使用windows版的NDK,可以参考 http://blog.csdn.net/do_script/article/details/26478583
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值