公司需要做一个sdk,里面需要用到别人写的c文件,第一次做,各种百度,各种学习,现在做一个小总结:
Android 设备的CPU类型(通常称为”ABIs”)
armeabiv-v7a: 第7代及以上的 ARM 处理器。2011年15月以后的生产的大部分Android设备都使用它.
arm64-v8a: 第8代、64位ARM处理器,很少设备,三星 Galaxy S6是其中之一。
armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。
x86: 平板、模拟器用得比较多。
x86_64: 64位的平板。
借鉴:http://blog.csdn.net/u013210543/article/details/52103015
一、新建一个project:例 ExampleDemo, 包名为:com.demo.example;
二、为项目配置ndk环境:
1、下载android ndk,并解压,我的存放目录为:D:\sl\android-develop\android-ndk-r14b;
2、点击进入Project Structure
3、在弹出框中选中 SDK Location 标签,在 Android NDK Location中选中ndk路径:
4、查看local.properties
5、gradle.properties项目的末尾添加这行代码:android.useDeprecatedNdk=true
三、开始创建操作;
1、新建一个class,添加native方法:
2、执行Build --》Make Project:
完成后可以看到,我们生成了他的class文件
四、命令行生成.h文件
1、打开Terminal
执行编译命令: javah -d jni -classpath [你的sdk路径]\platforms\android-22\android.jar;….\build\intermediates\classes\debug [你的包名+包含native方法的类]
我的是:
|
1
2
|
D:\sl\androidstudioproject\qrcodedemo\QRCodeDemo>javah -d jni -classpath D:\sl\android-develop\android-sdk-windows\platforms\android-``25``\android.jar;app\src\main\java com.cirein.qrcod
e.QRCodeManager
|
完成后会在项目中生成一个jni文件夹,下面就是我们生成的.h文件:
文件中的内容为:
现在开始实现.h文件里面的方法:将.h文件复制拷贝到jni,并重命名为:cirein.c(自己随便定义名称)
注:将其他的c文件也可以拷贝到jni文件夹下,在打so库的时候会一并打入;
对cirein.c文件进行编辑:我的项目中使用了其他的c文件,所以就不贴详细代码了
打开app Module的build.gradle文件,在defaultConfig节点里添加以下代码,并执行同步操作
我认为重要的是建Android.mk和Application.mk文件:
我的Android.mk文件:
LOCAL_PATH := (CLEAR_VARS) //固定写
LOCAL_MODULE := CIRein //生成的so名称
LOCAL_SRC_FILES := cirein.c \ CIRein_Base64.c \ CIRein_XXTea.c //用到的c文件
include $(BUILD_SHARED_LIBRARY) //生成动态库
我的Applicationmk文件:
|
1
|
APP_ABI := all ``//也可以指定格式
|
五、生成SO文件
执行:ndk-build//地下的图片错误了,请注意
|
1
|
D:\sl\androidstudioproject\qrcodedemo\QRCodeDemo>ndk-nuild
|
完成后就可以看见生成的so文件了:
现在就可以使用.so文件了
如果出现了,ndk-build不是内部命令,那么需要配置以下环境
在最下边的PATH中添加ndk的目录,一直到ndk-bundle
我的Terminal的命令如下:javah -d jni -classpath C:\Users\pwj\AppData\Local\Android\sdk\platforms\android-22\android.jar;app\src\main\java com.example.pwj.ctojava1.FromC
其中FromC是java文件,路径也为java文件的路径,不是debug的路径