当我们在开发android程序的过程中,有时候需要应用程序对底层硬件的调用。android官方给我们提供NDK以便于我们在我们的程序中调用C,C++库。Ndk是基于JAVA JNI技术所开发的一套应用于android编程的一系列工具集合,她可以帮助我们快速开发C或者C++的动态库并和应用一起打包生成APK。

关于JNI的原理,请参考 [ JAVA基础之理解JNI原理]

NDK的下载与安装

  • 前往前往http://developer.android.com/ndk/downloads/index.html。
  • 或者国内诸多镜像网站

  • 下载完成后直接解压后即可使用

NDK的在Android Studio中的使用

1、新建一个Android Studio工程
Android Studio下NDK的使用_第1张图片

2、配置工程中NDK的路径
file->project structure
Android Studio下NDK的使用_第2张图片

点击确定后,你的local.properties文件下面多了一行ndk的路径

Android Studio下NDK的使用_第3张图片

3、新建一个NDKTest类并编写如下代码
Android Studio下NDK的使用_第4张图片

public class NDKTest {    static {        System.loadLibrary("ndk_test");    }    public native static String hello();}

4、rebuild一下项目后,将工程求换到project目录
Android Studio下NDK的使用_第5张图片

bebug目录下面已经生成了刚才编写的NDKTest文件的.class文件
Android Studio下NDK的使用_第6张图片

然后我们通过terminal进入到这个目录下面
Android Studio下NDK的使用_第7张图片

使用javah生成c.h头文件
javah -jni com.hehao.ndkdemo.ndk.NDKTest

执行完成后将生成com_hehao_ndkdemo_ndk_NDKTest.h的一个C文件

接下来在main目录下面。新建一个jni目录
Android Studio下NDK的使用_第8张图片
Android Studio下NDK的使用_第9张图片

把我们之前用javah生成的.h头文件拷贝或者剪切到jni目录中去
Android Studio下NDK的使用_第10张图片

创建一个C文件来实现头头文件中声明的函数(名字随意)但是通常我们会使用java+包名+类名这样的名字
并在文件中添加如下代码

#include "com_hehao_ndkdemo_ndk_NDKTest.h"/* * Class: Java_com_hehao_ndkdemo_ndk_Test * Method: test * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_hehao_ndkdemo_ndk_NDKTest_hello        (JNIEnv *env, jobject obj){    return env->NewStringUTF("这里是来自c的:hello world!");}

Android Studio下NDK的使用_第11张图片

然后我们使用刚才的rebuild操作再重新构建一下项目 Build->Rebuild Project

PS:然后我发现项目报错了
Android Studio下NDK的使用_第12张图片
不知道为什么,重启一下AS后重新Rebuild一下,搞定

然后在运行的时候又提示了这个错误

按照他说的我们去gradle.properties的末尾添加一行代码

android.useDeprecatedNdk=true

再来 又报错了
Android Studio下NDK的使用_第13张图片
这个错误百度了很多资料,据说是NDK在windows下面的一个bug。我也没有考证,引用别人的说法。
解决办发是在jni目录下创建一个空的c文件

再来,终于运行成功了。然后我们在mainActivity中尝试调用一下NDK类的代码

package com.hehao.ndkdemo;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.TextView;import com.hehao.ndkdemo.ndk.NDKTest;public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        TextView textView = (TextView) findViewById(R.id.ndk_test);        textView.setText(NDKTest.hello());    }}

然后发现出错了

一定位,发现加载类的时候出问题了

这时,需要在App模块的gradle文件中添加

ndk {            moduleName "ndk_test"          //生成的so名字            abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库,目前可有可无}

Android Studio下NDK的使用_第14张图片
生成的.so文件要和我们在之前创建的Java文件中引入的保持一致

成功

Android Studio下NDK的使用_第15张图片

参考文章 http://www.open-open.com/lib/view/open1451917048573.html
参考文章 http://www.th7.cn/Program/Android/201509/572743.shtml

git地址 : http://git.oschina.net/hehao512/NdkDemo

更多相关文章

  1. Android大图片之缩略图,以及对原图按照指定宽高裁剪成缩略图
  2. 深入分析android中用SAX解析XML文件并纠错
  3. Android 使用Picasso加载网络图片等比例缩放
  4. android展讯平台重要的打包命令及生成镜像文件的Linux命令
  5. 最全的android图片加密
  6. Android开发之网络请求通信专题(二):基于HttpClient的文件上传下载
  7. Android学习札记44:解读APK反编译后得到的布局文件
  8. Android中Gif图片的显示

随机推荐

  1. android之listView定位到指定行同时隐藏
  2. Android的/system/lib里加入自己的so库
  3. Android_0.9 蓝牙栈bluez使用方法
  4. Android(安卓)ActionBar完全解析,使用官方
  5. 【转】Android(安卓)jar resource 资源文
  6. 阿里巴巴不建议 boolean 类型变量用 isXX
  7. android面试(1)----布局
  8. Android之开发性能优化简介
  9. Android(安卓)- ListView在setAdapter()
  10. android点击输入法会把底部顶上去的解决