返回
NDK真功夫:Google示例带你玩转原生C++ Activity
Android
2023-11-14 16:19:34
准备好了吗?我们即将踏上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开发之旅才刚开始,让我们继续探索更多可能性!