首先 看一下程序的运行效果
准备工作:
参考文章:NDK 开发 从入门到放弃
1.首先从官网下载ndk开发工具 ndk_bundle
在Android Studio中进行配置
File->Project Structure->Android NDK Location-> 选择ndk下载路径 -> OK
so easy!!!!!!!!
2.开发前需要对Android Studio 进行 命令配置
两个命令 javah和ndk-build.cmd
javah 用于生成与JNI对应的 c/c++ 头文件
配置 Setting->Tools-> External Tools -> 添加
Name : javah.jni
Description: 什么乱七八糟
Tool Setting
Program: 选择javah 路径; 我的路径为 C:\Program Files (x86)\Java\jdk1.8.0_144\bin\javah.exe
Parameters:命令参数 -classpath . -jni -d $ModuleFileDir$/src/main/jni $FileClass$
Working directory: 工作路径 $ModuleFileDir$\src\main\java
ndk-build.cmd 根据c/c++生成so文件
Setting->Tools-> External Tools -> 添加
Name : ndk-build
Description:随便填
Tool Setting
Program: ndk-build安装路径 G:\AndroidNDK\ndk-bundle\ndk-build.cmd
Parameters:
Working Directory: 工作路径 $ModuleFileDir$\src\main\
开始编码
1.新建java Class JniClass, 添加 native 方法 egtStringFromC() ,注意添加 native字段 ,标明该方法是原生方法。
在目录 选择该类 点击鼠标右键 选择 External Tools 可以看到 javah.jni 的命令 点击
可以看到 main目录下多了一个jni目录 ,有一个以包名加类名为命名方式的c语言头文件 ,
可以将 改头文件重命名 为 jniclass.h(任意名字)
需要用到里面的 一个以包名加类名加方法名的方法 JNIEXPORT jstring JNICALL Java_com_micheal_testndk_JniClass_getStringFromC
(JNIEnv *, jclass);
新建文件 jniclass.c 将头文件里面的方法copy到 cpp文件中(最好是复制 自己写也行 不过必须相同 ) 方法里面的参数 JNIEnv 代表指向java虚拟机的指针 ,jclass 代表调用 ndk方法的java对象 ,如果 native方法 中有入口参数 ,紧跟在 第二个参数后面 ,前两个参数在使用 javah生成头文件时一定会生成的 ,之后的参数根据native方法生成。。。。。
代码编写完成,需要在目录下添加 两个mk文件
Android.mk 用于指定生成编译生成的so库名称 引用的头文件目录 ,需要编译的 c/c++ 文件和静态库文件 用法参考 : Android.mk 用法详解
Application.mk 指定需要编译的cpu架构平台 APP_ABI有四种类型(默认armeabi),armeabi、armeabi-v7a、x86、mips
一切就绪 选中之前新建的 jniclass.cpp 文件 使用ndk-build命令生成so库
可以看到 libs文件夹下面 生成了 各个平台下的 so文件 至此 编码 已经完成 用 Android Studio的同学注意了 ,so文件编译生成的路径在 main/libs下 但是 Android Studio 默认so文件路径 在 jniLibs下 ,所以需要在main文件夹下 新建jniLibs文件夹 将所有的so文件复制过去 ,否则运行时会抛出异常
接下来开始运行
和预期效果相同,多谢阅读。
文章仅供新手参考,存在错误之处 ,敬请指出, 本人也是新手,求交流,求批评。