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

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

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

先看效果图:

Java代码中调用C代码

!Markdown

C代码调用Java代码中

Markdown

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.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项目:

https://github.com/androidstarjack/MyNDKTestApp

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

AndroidStudio项目:

http://download.csdn.net/detail/androidstarjack/9855325

之前基于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探究之旅:

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

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

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

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

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

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

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

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

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

### 相信自己,没有做不到的,只有想不到的
如果你觉得此文对您有所帮助,欢迎入群 QQ交流群 :232203809
微信公众号:终端研发部

Markdown

(欢迎关注学习和交流)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

androidstarjack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值