android平台下如果要进行c/c++开发,是需要借助ndk这个开发工具的,ndk环境搭建无论是windows还是mac平台下,都比较的简单(百度一下)。本文着重介绍,ndk的编译,编译也有2中方式,第一种最原始的也是最通用的命令行的方式,第二种是一键编译(编写脚本)。而实现java和C/C++沟通的桥梁就是jni,实现jni首先就是为包含native方法的java文件生成相应的点h头文件!
一、命令行方式:
1.android studio(Mac)中如何利用命令行生成.h文件。
android studio中内置一个终端 Terminal ,非常的好用!该终端的默认地址是该工作空间的根目录。在Mac下可以利用ls 命令遍历根目录下的所有文件夹。然后利用javah命令生成头文件。例如我的Module名叫cc,所以首先 cd cc/src/main/java 然后敲javah命令。
-d ../jni是生成和java文件同级的jni文件夹 -jni是对CDemo.java(包含native方法 ,使用全类名)文件,生成.h头文件! 至于编译看下面的一键编译。
2.Windows平台下的,如何在eclipse中利用命令行生成.h 头文件:
首先按快捷键 Windows+R 然后输入cmd进入命令行终端。紧接着使用cd命令切换到 工作空间目录,然后cd 进入src目录;第一步首先对含有native方法的java文件进行编译,使用javac命令。 然后使用javah命令进行编译生成头文件。与mac平台下的android studio相比多了javac的命令行操作。编译结果如下:
接下来进行编译:需要使用ndk-build命令,如下图:(首先确保你的ndk已经安装好,ndk的环境搭建比较简单,网上方法比较多,百度下就有。)
第一步依然是进入工作空间的根目录,进入之后直接敲ndk-build命令就行了!编译结果如下图:
可以看见libs目录下面多了armeabi文件夹,下面多了cc库。执行ndk-build命令之前还要编写Android.mk脚本文件。其中LOCAL_MODULE表示库的名字,最后会加上前缀lib和后缀.so ,使用System.loadLibrary的时候只需填上cc即可,LOCAL_SRC_FILES表示实现上面.h头文件的实现文件cpp文件(当然也可以是.c文件)。
以上命令,如果在做项目的过程中一直敲的话,着实比较的蛋疼,因为我们往往更加的关心程序的逻辑处理而不是工具的使用,下面就来介绍一键编译!
二、一键编译:
1.windows平台下面怎么使用eclipse的方式进行一键编译:
首先必须要生成对应的.h头文件。如图点击External Tools Configurations...
在Program上右键单击,然后新建,按如下图操作:
-classpath ${project_loc}\bin\classes -d ${project_loc}\jni -jni ${java_type_name} 6处直接复制这句就行。
紧接着按照这两副图操作一键编译生成.h文件的脚本就生成功了。
最后点击Apply之后点击Close,这样一键生成.h文件就完成了。下面来测试下:
当然,我们还并不满足于这。同样,ndk-build也是可以配置的,按照下图即可完成!
首先依然是点击External Tools Configurations...然后新建脚本。
这样都配置完成之后,确保你工程里面的application.mk和Android.mk文件(文件需自己新建)都存在后,然后选中项目,点击NDK_build即可一键编译了!
2.Mac平台下怎么使用android studio(2.2.3)进行一键编译:
首先还是配置快捷生成.h文件的脚本:点击Configure.
Program:/usr/bin/javah
Parameters: -v -jni -d $ModuleFileDir$/src/main/jni $FileClass$
Working directory: $SourcepathEntry$
如果是Windows平台 Program:javah
最后在项目工程写有native方法的java文件上右击选择Android Tools(名字自己取的),点击里面的JavaH脚本即可在jni目录下面生成.h头文件.
接下来需要编译:
android studio工程比较麻烦,idk需要在gradle中配置,就相当于eclipse中的mk文件:
1.首先在local.properties文件中添加ndk的目录,比如:/Users/zhulei/android-ndk-r13 或者右键工程open module settings 可视化界面选择ndk目录。
2.在gradle.properties文件中末尾添加 android.useDeprecatedNdk=true
3.最后在项目的gradle文件中添加ndk的配置:
ndk{
moduleName"test"
ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
其中moduleName便是生成的动态库的名字 ldLIbs 表示jin用到的库,abiFilters 表示用到的平台。
最后编写.h的实现类,然后点击Build后点击Make Project或则锤子标识按钮之后就开始编译了,编译成功后可在项目的build/intermediates/ndk/debug/lib目录下找到编译成功的so文件。
三、关联源码
如果是android studio的话,直接就关联源码了,但是如果是eclipse的话,就需要在新建的工程上右键单击Android Tools 然后Add Native Support,之后就关联android stuio源码了。(如果写的什么问题,欢迎下方留言,大家共同讨论,共同进步!)