前几次总结了一下关于C或C++的基础知识及其开发流程。之前也大部分都是基于Elipse的。今天我们用AndroidStudio来开启我们的第一个项目实战。
但是基于AndroidStudio方面,以后趋势都是AndroidStudio开发NDK的,我们也同样的以后要用ES进行开发NDK.
先看效果图:
Java代码中调用C代码
!
C代码调用Java代码中
AndroidStudio环境配置:
环境搭建
请参考:
下载地址 :https://developer.android.com/ndk/downloads/index.html(需要翻墙,你懂得)
在File–>Project Structure配置其路径
添加 ndk 后你会在 local.properties 这个文件看到(路径取决于你 ndk 的位置):
在此处加上这句代码:android.useDeprecatedNdk=true好了,ndk 环境搭建完毕!
开发示例流程
1.编写native方法
public class NdkJniUtils {
static {
System.loadLibrary("myJniApp");
System.loadLibrary("unstallApp");
}
public native String getCLanguageString();
public native void uninstallListener();
}
2.在src/main目录下创建jni文件夹
3.生成.h头文件
1.首先build或者是make project使项目生成.class文件
2.在Androidstudio下的Terminal窗口里生成.h头文件
3.javah 包名.类名
如:
Javah jni.yyh.com.mycptojavanative.jni.cold.yyh.com.myndk01.NdkJniUtils
4.将生成的.h头文件Copy到jni目录下面
3.编写C代码
在jni目录里右击项目,新建.C文件进行编写C代码
现将生成的h文件里的内容Copy到.c文件里面去
去除不关联的无用的内容
按照规范进行C代码代码的编写
最后C代码示例:
#include <jni.h>
JNIEXPORT jstring JNICALL Java_cold_yyh_com_myndk01_NdkJniUtils_getCLanguageString (JNIEnv * env, jobject obj){
return (*env)->NewStringUTF(env,"你好,ndk,我来了");
}
4.编写Android.mk文件
网上有很多博文来并没有要求建立Android.mk文件
但是为了正确的编译C代码,防止编译出错,这里我建议最好创建Android.mk
之前在Eclipse中建议将jni.h文件copy到jni文件夹下面,这里androids是之内的,无需做此操作
5.配置相关的gradle
声明ndk标签
如果不声明ndk标签,项目默认会创建一个libapp.so的文件(存放目录app\build\intermediates\ndk)
ndk {
// 声明创建so库的文件名,会自动添加lib前缀, 添加了前缀,不会自动添加
moduleName "serviceData"
//声明启用Android日志, 在c/c++的源文件中使用的#include <android/log.h> 日志将得到输出
ldLibs "log"//实现__android_log_print
// 声明创建指定cpu架构的so库, 不声明的话, 默认(gradle 1.5.0)会生成4中架构 多一种mips架构
// 具体cpu架构的区别请参考:
// for detailed abiFilter descriptions, refer to "Supported ABIs" @
// https://developer.android.com/ndk/guides/abis.html#sa
abiFilters "armeabi", "armeabi-v7a", "x86"
}
//指定Android.mk文件
externalNativeBuild{
ndkBuild{
path "src/main/jni/Android.mk"
}
}
//指定so文件路径
sourceSets.main {
// 1. 配置在根目录libs下可以加载第三方so库, (最好不要创建jniLibs, 在众多的开源库中可能会引起冲突,还没发现)
// 2. 运行时会自动将libs目录下的so库拷贝到指定目录
// 3. 如果自己创建的so不需要重新编译,可以将(app/build/intermediates/transforms)生成的so拷贝到这个目录
jni.srcDirs = []
// 如果是单个文件夹 可以直接这样如下配置
//jniLibs.srcDir
//设置目标的so存放路径
jniLibs.srcDir 'src/main/jniLibs'
}
6.生成.so文件
利用AndroidStudio进行生成.so文件
build APK 、Make Project 、make Project Model 或者是 Rebuild Project 都能生成.so文件
注意:之前有找不到.so文件的情况,
这里已经解决。
其实so文件是存在 (app/build/intermediates/transforms)目录下的
将生成的so文件Copy到jniLibs文件夹下。
注意这里要新建jnilibs。
这里你也可以用命令指定生成ndk-build.cmd
7.在Java代码中调用动态链接库(.so)
在相应的地方进行加载so文件
static {
System.loadLibrary("myJniApp");
System.loadLibrary("unstallApp");
}
8.调用
示例代码:
private Button btn_onclick,btn_onclick2;
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) this.findViewById(R.id.test);
btn_onclick = (Button) this.findViewById(R.id.btn_onclick);
final NdkJniUtils jni = new NdkJniUtils();
btn_onclick.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mTextView.setText(jni.getCLanguageString());
}
});
findViewById(R.id.btn_onclick2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
jni.uninstallListener();
mTextView.setText("监听SD卡状态,查log日志");
}
});
项目下载地址:
github相关下载连接:
AndroidStudio项目:
如果下载不了,也可以通过csdn下载
AndroidStudio项目:
之前基于Eclise相关所写的介个项目
运行我的第一个ndk项目
http://download.csdn.net/detail/androidstarjack/9855296
仿银行登录系统
http://download.csdn.net/detail/androidstarjack/9855292
博客地址:
http://blog.csdn.net/androidstarjack/article/details/72758094
NDK探究之旅:
### 相信自己,没有做不到的,只有想不到的
如果你觉得此文对您有所帮助,欢迎入群 QQ交流群 :232203809
微信公众号:终端研发部
(欢迎关注学习和交流)