Android studio开发NDK

关于ndk的一些介绍与用途,简单做下介绍:

Android NDK是什么

NDK是一系列工具的集合。NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。

NDK提供了一份稳定、功能有限的API头文件声明。Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。

NDK能干什么

使用NDK,我们可以将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。使用NDK,我们可以将需要保密的应用逻辑使用C开发。毕竟,Java包都是可以反编译的。跨平台。

准备工作:
NDK下载 android-ndk-r10e-windows-x86_64.exe

使用C代码输出ndk的Hello World

Step1 在Java代码中声明本地方法

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public native String ndkHello();
}

声明native方法后,studio的code lint会提示如下:
这里写图片描述
lint提示我们找不到对应的JNI function,马上去创建(这个会导致UnsatisfiedLinkError异常)

Step2 实现Java本地接口(JNI)粘合层
JNI是什么?JNI,即Java Native Interface ,没错它就是本地编程接口,Java通过JNI框架调用库里的C/C++方法,连通了Java层与C层。
JNI不是写出来的,是.class文件生成的。具体操作如下:

首先 对我们的项目进行编译,Build->Make Project,然后找到Mainactivity.class。
使用gradle构建工程的话,在以下目录中:

接着 我们利用javah命令生成c头文件,打开终端,进入\app\src\main路径,执行命令javah -d jni -classpath

javah -d jni -classpath d:\sdk\sdk\platforms\android-21\android.jar;..\..\build\intermediates\classes\debug com.xixi.mario.MainActivity

执行完命令后,生成jni文件如下:
这里写图片描述

打开文件,重点部分如下:

/*
 * Class:     com_xixi_mario_MainActivity
 * Method:    ndkHello
 * Signature: ()V
 */
JNIEXPORT jstring JNICALL Java_com_xixi_mario_MainActivity_ndkHello
  (JNIEnv *, jobject);

ok,到这里jni文件已经生成ok,连接java和c的桥已经搭好,最后就差写一个hello world的c文件了!

Step3 创建C的Hello World

#include <com_xixi_mario_MainActivity.h>
#include <string.h>

/*
 * Class:     com_xixi_mario_MainActivity
 * Method:    ndkHello
 * Signature: ()V
 */
jstring Java_com_xixi_mario_MainActivity_ndkHello(JNIEnv *env, jobject obj) {
    char *str = "Hello World from c!";
    return (*env)->NewStringUTF(env, str);
}

写好以后是这样的:
这里写图片描述

Step4 配置NDK
软环境到此结束,另一边我们的ndk也下载解压好了,该他上场了。
在上面第三步结束后,如果你再次编译工程,会出现如下错误。提示ndk未配置。
(同时需要在.gradle目录下新建gradle.properties文件,加入android.useDeprecatedNdk=true)

Error:Execution failed for task ':app:compileDebugNdk'.
> Error: NDK integration is deprecated in the current plugin.  Consider trying the new experimental plugin.  For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental.  Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration.

首先 在local.properties配置ndk的路径,建议在project structure里直接设置

接着 修改build.gradle配置(这步操作可以替代新建mk文件)。在\app\build.gradle这个文件中,defaultConfig分支中增加上

    ndk {
        moduleName "Mario"
        ldLibs "log", "z", "m"
        abiFilters "armeabi", "armeabi-v7a", "x86"
    }

加了以后,你这个文件应是这样的:
这里写图片描述
配置后生成指定的so库名称为Mario,链接时使用到的库,对应android.mk文件中的LOCAL_LALIBS,及最终输出指定三种abi体系结构下的so库。

此时,再次执行build命令,在如下目录都得到so库:

Step Last 开始看效果吧
最后我们可以调用这个ndkHello试试效果咯

这里写图片描述

笔者使用一个btn,点击以后弹出一个toast,装载来自c的say hello。运行,点击,如图:

这里写图片描述

大功告成!
有问题大家可以评论交流!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值