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

阅读 324
收藏 30
2017-05-31
原文链接:mp.weixin.qq.com

前言介绍

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

博客地址:

blog.csdn.net/androidstar…

背景

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

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

先看效果图:

Java代码中调用C代码

!

C代码调用Java代码中

AndroidStudio环境配置:

开发示例流程

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头文件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;@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项目:

github.com/androidstar…

如果下载不了,也可以通过csdn下载

AndroidStudio项目:

download.csdn.net/detail/andr…

之前基于Eclise相关所写的介个项目

运行我的第一个ndk项目

download.csdn.net/detail/andr…

仿银行登录系统

download.csdn.net/detail/andr…

博客地址:

blog.csdn.net/androidstar…

NDK探究之旅:

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

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

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

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

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

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

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

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

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

让心,在阳光下学会舞蹈

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

—终端研发部—


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

微信公众号:终端研发部


评论