返回

NDK真功夫:Google示例带你玩转原生C++ Activity

Android

准备好了吗?我们即将踏上NDK旅程的第二章,这次,我们将深入探索Google官方示例,学一手如何在不依赖Java代码的情况下用C++打造原生Android Activity。

项目结构一览

下载官方示例后,让我们先来瞅瞅项目结构:

cpp
├── CMakeLists.txt
├── include
│   └── my_app
│       └── jni.h
├── jni
│   ├── my_app
│   │   ├── activity.cc
│   │   ├── my_app.cpp
├── res
├── Android.mk
├── Application.mk
├── gradle
│   ├── wrapper
│   │   ├── gradle-wrapper.properties
│   └── wrapper
│       └── gradle-wrapper.jar
├── gradlew
├── gradlew.bat
├── settings.gradle
├── build.gradle
└── local.properties

cpp文件夹下,我们有C++代码,包括头文件和源文件。

打造C++ Activity

第一步:创建C++头文件

my_app文件夹下创建jni.h头文件,定义Java和C++之间的接口。

#ifndef JNI_H
#define JNI_H

#include <jni.h>

JNIEXPORT void JNICALL
Java_com_example_myapp_MainActivity_createNativeActivity(JNIEnv *env, jobject instance, jobject activity);

#endif /* JNI_H */

第二步:实现C++源文件

my_app文件夹下创建my_app.cpp源文件,实现C++ Activity逻辑。

#include <jni.h>
#include "jni.h"

extern "C" JNIEXPORT void JNICALL
Java_com_example_myapp_MainActivity_createNativeActivity(JNIEnv *env, jobject instance, jobject activity) {
    // 你的C++ Activity实现
}

第三步:修改Android.mk

修改Android.mk文件,指定C++编译器和链接器标志。

LOCAL_MODULE := my_app

INCLUDE_DIRS := $(LOCAL_PATH)/include

LOCAL_SRC_FILES := \
    my_app.cpp

LOCAL_LDLIBS := -llog

第四步:修改Application.mk

修改Application.mk文件,指定NDK路径和架构。

APP_STL := gnustl_static

APP_ABI := armeabi-v7a

NDK_TOOLCHAIN_VERSION := clang

NDK_MODULE_PATH := $(call my-dir)

集成到Java代码

在Java代码中调用C++ Activity:

public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("my_app");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 调用C++ Activity
        createNativeActivity(this);
    }

    public native void createNativeActivity(Object activity);
}

示例代码:

代码链接

总结

通过Google官方示例,我们成功用C++编写了原生Android Activity,并将其集成到Java代码中。NDK开发之旅才刚开始,让我们继续探索更多可能性!