Android NDK初次学习

最近博主开始学习如何使用NDK,在此进行一下总结。


博主的IDE为Android Studio 2.3.1,接下来博主将演示如何在现有的项目上支持NDK。

下载NDK

首先,使用SDK Manager下载SDK Tools调试工具LLDB、编译工具CMake以及NDK:
download

NDK也可以去官网进行下载: NDK下载地址

编写java文件

首先,我们编写一个Native工具类,里面定义了一个native方法获取字符串:
public class NativeUtils {
    
    public static native String getNativeString(String str);
    
}

然后在我们的主界面打印这个字符串:
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv = (TextView) findViewById(R.id.tv);
        tv.setText(NativeUtils.getNativeString("Java world"));
    }
}

接着我们在app根目录下创建一个jni文件夹:
create_jni_folder

创建完成后,我们多了一个cpp的文件夹(实际上是jni文件夹,Android视图进行了简化):
new_cpp_folder

然后我们Make Project,使其Java代码生成.class文件,并打开终端:
terminal

定位到生成.class文件的目录下:
cd app\build\intermediates\classes\debug

使用java命令的jni框架生成.h文件:
javah -jni 完整包名.类名

然后使用project 视图找到我们的.h文件:
cut_h

把生成的.h文件剪贴到我们的jni文件夹中新建的include目录下:
jni_include_h

链接到Gradle

首先我们需要在工程的Project Structure 下设置NDK 的目录:
ndk_dir

在local.properties文件中添加ndk.dir属性亦可达到同样效果:
ndk_dir_2

然后我们在cpp文件夹下创建空白的NativeUtils.cpp文件

接着打开Project视图,在工程的根目录下新建CMakeLists.txt 文件:
# Sets the minimum version of CMake required to build your native library.
# This ensures that a certain set of CMake features is available to
# your build.

cmake_minimum_required(VERSION 3.4.1)

# Specifies a library name, specifies whether the library is STATIC or
# SHARED, and provides relative paths to the source code. You can
# define multiple libraries by adding multiple add.library() commands,
# and CMake builds them for you. When you build your app, Gradle
# automatically packages shared libraries with your APK.

add_library( # Specifies the name of the library.
             # so动态链接库文件名
             NativeUtils

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             # cpp文件名
             app/src/main/jni/NativeUtils.cpp )

# Specifies a path to native header files.
# .h头文件位置
include_directories(app/src/main/jni/)

在Android视图中,选择我们的cpp文件夹,选择链接到Gradle:
link_cmake_gradle

选择CMake编译系统,并选择我们的CMakeLists.txt:
select_cmake_lists

我们也可以通过在app模块的build.gradle的android的属性添加一下代码达到相同的效果:
    externalNativeBuild {
        cmake {
            path '../CMakeLists.txt'
        }
    }


进行Gradle sync 同步过后,我们可以开始进行cpp代码编写了。

编写cpp文件

首先我们编写NativeUtils.cpp 文件,实现具体的Native方法:
#include <iostream>
#include "com_app_superxlcr_myndktest_NativeUtils.h"

using namespace std;

/*
 * Class:     com_app_superxlcr_myndktest_NativeUtils
 * Method:    getNativeString
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_app_superxlcr_myndktest_NativeUtils_getNativeString
  (JNIEnv * env, jclass clz, jstring str) {
        // 获取Java层传来的字符串
        jboolean* isCopy;
        const char* nativeChars = env->GetStringUTFChars(str, isCopy);
        // 构造返回字符串
        string nativeStr = "Native world get Message :";
        nativeStr.append(nativeChars);
        // 释放Java字符串资源
        env->ReleaseStringUTFChars(str, nativeChars);
        // 返回结果
        return env->NewStringUTF(nativeStr.c_str());
  }

然后我们在NativeUtils.java 文件中添加如下代码载入动态链接库:
    static {
        System.loadLibrary("NativeUtils");
    }

编译运行的效果如下:


更多关于NDK的信息请参考官方的链接: https://developer.android.com/ndk/index.html#Revisions
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值