android studio中ndk的使用

如何优雅地使用NDK

在Android Studio上使用了一段时间的NDK,感觉官方的插件com.android.tools.build.gradle-experimental还是不够稳定,存在一定问题,不过谷歌也声明了这个插件是在实验性阶段。幸好官方在Android Studio上提供了另一种方式使用NDK,这篇博客就讲讲这种到目前为止我觉得非常赞的方法。


开发环境


  1. 基础的安卓开发环境:Android Studio、SDK、JDK

  2. 下载好NDK,自己手动下载或者用SDK工具下载都可以


我使用的版本:Android Studio 1.5.1


配置常用命令


NDK开发比较常用的命令就是生成头文件、构建so包,在android studio上我们可以先配置好命令,使用起来就很方便了,这是我感觉最赞的地方。


如下图所示,我添加了三个命令,按加号添加



其中一个命令的配置详情如下图:



命令配置参数:


javah用于生成头文件


Program:$JDKPath$/bin/javah


Parameters: -encoding UTF-8 -d ../jni -jni $FileClass$


注意:这个命令我加上了-encoding UTF-8指定编码,你可以改成你工程的编码。


Working directory: $SourcepathEntry$\..\java


ndk-build用于构建so包


Program: 你的NDK目录\build\ndk-build.cmd


注意:windows用ndk-build.cmd,MAC/Linux用ndk-build


Parameters: 什么都不用填


Working directory:$ModuleFileDir$\src\main


ndk-build clean清除so包


Program: 你的NDK目录\build\ndk-build.cmd


注意:windows用ndk-build.cmd,MAC/Linux用ndk-build


Parameters: clean


Working directory:$ModuleFileDir$\src\main



配置完三个命令之后,你就可以在右键菜单中找到这几个命令,可以直接使用。如下图演示了生成NdkTest类的头文件



配置工程


让工程项目使用NDK,需要做一些配置工作


local.properties文件中填写使用的NDK目录:


ndk.dir=你的NDK目录的绝对路径


gradle.properties文件中添加如下代码


1
android.useDeprecatedNdk =  true


在module的build.gradle添加如下代码:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
android {
    {  ndk
       {
           moduleName  "NdkTest" //定义NDKlibrary的名字
           //ldLibs "log" 添加log库,看自己需求
       }
    }
    //这里设置目录,默认就这样写就可以了
    sourceSets {
        main {
             jni.srcDir  "src/main/jni"
             jniLibs.srcDir  "src/main/libs"
        }
    }
}


Hello word


按上面的步骤全都配置完之后就可以在Android Studio上享受NDK了。
下面写一个简单的返回Hello word字符串的程序。


首先在java中声明一个本地方法,并加载本地库,如下:


1
2
3
4
5
6
7
public class NdkTest
{
      static {
           System.loadLibrary( "NdkTest" );
      }
      public static native String getString();
}


生成它的头文件(自动生成的名字是包名+类名me_majiajie_ndktest_NdkTest.h),并且创建c/c++文件(NdkTest.cpp),如下:


1
2
3
4
5
6
#include  "me_majiajie_ndktest_NdkTest.h"
JNIEXPORT jstring JNICALL Java_me_majiajie_ndktest_NdkTest_getString
  (JNIEnv *env, jclass jc)
{
       return env->NewStringUTF( "Hello word !!!" );
}


在jni目录创建一个文件命名为Android.mk,填入以下内容


1
2
3
4
5
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := NdkTest
LOCAL_SRC_FILES := NdkTest.cpp
include $(BUILD_SHARED_LIBRARY)


然后在jni目录创建一个文件命名为Application.mk,填入以下内容


1
2
APP_MODULES := NdkTest
APP_ABI := all


注意:Android.mkApplication.mk都是NDK默认的配置文件,关于这两个文件的详细介绍可以看官网。


最后生成so包就可以了,记住每次修改C文件都需要重新生成so包:



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值