查看原文
其他

NDK探究之旅《十》——ndk项目实战之Androidstudio开发经验总结

2017-05-31 于亚豪 终端研发部




前言介绍


前几次总结了一下关于C或C++的基础知识及其开发流程。之前也大部分都是基于Elipse的。今天我们用AndroidStudio来开启我们的第一个项目实战。

博客地址:


背景


前几次总结了一下关于C或C++的基础知识及其开发流程。之前也大部分都是基于Elipse的。今天我们用AndroidStudio来开启我们的第一个项目实战。

但是基于AndroidStudio方面,以后趋势都是AndroidStudio开发NDK的,我们也同样的以后要用ES进行开发NDK.

先看效果图:

Java代码中调用C代码

!

C代码调用Java代码中

AndroidStudio环境配置:

  • 环境搭建

    请参考:

    • 下载地址 :

    • 在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.NdkJniUtils4.将生成的.h头文件Copyjni目录下面

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文件copyjni文件夹下面,这里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;@Overrideprotected 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项目

仿银行登录系统

博客地址:

NDK探究之旅:

NDK探究之旅《一》——对jni和NDK的认识

NDK探究之旅《二》——C语言的基本认识

NDK探究之旅《三》—C语言的输入输出函数

NDK探究之旅《四》——指针的强化理解

NDK探究之旅《五》——指针和数组之间的关系

NDK探究之旅《六》—函数的指针、结构体、枚举、宏定义

NDK探究之旅《七》—函数指针,宏定义的优缺点及应用场景

NDK探究之旅《八》——jni的开发流程规范及环境配置

NDK探究之旅《九》——jni开发中常见的错误及其注意事项




让心,在阳光下学会舞蹈

让灵魂,在痛苦中学会微笑

—终端研发部—



如果你觉得此文对您有所帮助,欢迎入群 QQ交流群 :232203809   

微信公众号:终端研发部


            

Hello,伙伴们






您可能也对以下帖子感兴趣

Android主线程锁监控的一种方案
Android 15 上适配 16K Page Size 的填坑思路,以 IJKPlayer 为例子
Android 15 适配之16K Page Size :为什么它会是最坑的一个适配点
Android 15 之如何快速适配 16K Page Size
Android 15 适配之16K Page Size :为什么它会是最坑的一个适配点

文章有问题?点此查看未经处理的缓存