Android进阶之路Android开发经验谈Android开发

NDK开发(一) :NDK入门指南

2019-08-20  本文已影响5人  2c3d4f7ba0d4

本文操作以 Android Studio 3.4.2 版本为例


目录


环境配置


创建支持 C/C++ 的新项目

Android Studio将会为我们生成一个模板工程,我们可以直接运行,启动之后界面上会显示 Hello from C++


支持 C/C++ 的项目文件介绍

Android Studio 左侧打开 Project 窗格并选择 Android 视图,如下图:

image

我们只要关心上图红框标记出来的以下这些文件就好:

如果刚刚运行过项目的话,点击左侧Project 窗格并选择 Project 视图,会在 app/build/intermediates/cmake/debug/armeabi-v7a/下生成一个 libnative-lib.so文件。

CMake 使用 lib库名称.so 的规范来为库文件命名,库名称即为我们定义的 native-lib。不过我们在Java代码中加载时,还是使用我们定义的库名称 native-lib

static {
    System.loadLibrary("native-lib");
}


向现有项目添加 C/C++ 代码

向现有 Android Studio 项目添加或导入原生代码,则需要按以下基本流程操作:

重新创建一个 Basic Activity的工程。
image
创建新的原生源文件
创建 CMake 构建脚本

如果您的原生源文件还没有 CMake 构建脚本,则您需要自行创建一个并包含适当的 CMake 命令。

必须将其命名为 CMakeLists.txt

将 Gradle 关联到您的原生库

要将 Gradle 关联到您的原生库,您需要提供一个指向 CMakendk-build 脚本文件的路径。在您构建应用时,Gradle 会以依赖项的形式运行 CMakendk-build,并将共享的库打包到您的 APK 中。

image
配置Javah命令工具

如下图,按 Ctrl + Alt + s 进入 Setting 界面,点击 Tools → External Tools → + 配置添加外部工具。参数如下:

Name :JavaH
Program:$JDKPath$/bin/javah
Parameters: -encoding UTF-8 -d ../cpp -jni $FileClass$
Working directory: $SourcepathEntry$\..\java

image
编辑 MainActivity

MainActivity 添加如下代码:

public class MainActivity extends AppCompatActivity {
    static {
        System.loadLibrary("hello-ndk");
    }
    public native String helloNDK();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        //添加下面两行代码
        TextView show = findViewById(R.id.tv_show);
        show.setText(helloNDK());

        ....
    }
    ...
}

修改 content_main.xml

修改 content_main.xml,给TextView添加 android:id="@+id/tv_show"

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    ...>

    <TextView
        android:id="@+id/tv_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        .../>
</android.support.constraint.ConstraintLayout>

生成 .h 头文件

如下图,右键点击MainActivity,选择弹出框中的 External ToolsJavaH 。就会在cpp目录下生成 com_example_myapplication_MainActivity.h文件,你的文件名可能不一样。

image
编辑hello-ndk.cpp

修改hello-ndk.cpp为以下代码:

#include <jni.h>
//确认此处名字是否可你生成的头文件的名字一样
#include "com_example_myapplication_MainActivity.h" 

//函数名要和头文件中的名字一致
JNIEXPORT jstring JNICALL Java_com_example_myapplication_MainActivity_helloNDK  
  (JNIEnv * env, jobject){
    return env ->NewStringUTF("Hello NDK");
}

运行程序

点击顶部菜单栏 Build 中的 Rebuild Project,完了之后按 Shirt + F10 运行程序,然后界面上就会显示 Hello NDK 的字样。

原文链接:https://www.jianshu.com/p/63b19f174bc2

最后

漫漫开发之路,我们只是其中的一小部分……只有不断的学习、进阶,才是我们的出路!才跟得上时代的进步!

我从事Android开发快十年了,今年年初我花两个月的时间收录整理了一套知识体系,此外,还有面试专题、架构视频,如果有想法深入的系统化的去学习的,可以关注我,加入Android进阶技术交流 (895077617 )免费获取整理版的资料**
,我会把我收录整理的资料都送给大家,帮助大家更快的提升。

重要的事说三遍,转发+转发+转发,让更多需要的朋友们都可以看到并且领到!

上一篇下一篇

猜你喜欢

热点阅读