NDK(一) hello world

1.NEW一个新的Project

2.app->New->Folder->JNI Folder

3.app/src/main/jni ->New ->Android.mk,Application.mk,hello.cpp


Android.mk:

LOCAL_PATH       :=  $(call my-dir)
include              $(CLEAR_VARS)
LOCAL_MODULE     :=  hello-module
LOCAL_SRC_FILES  :=  hello.cpp
include              $(BUILD_SHARED_LIBRARY)

Application.mk

APP_ABI := armeabi
APP_PLATFORM := android-19

hello.cpp:

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

extern "C"
JNIEXPORT jstring JNICALL
Java_com_movitech_myapplication_MainActivity_hello(JNIEnv *env, jclass type) {
    return env->NewStringUTF("hello world From C.ndk-build");
}

4.build.gradle(app)

defaultConfig {
   
    ndk {
        moduleName "hello-module"
        stl "stlport_static"
        ldLibs "log"
        abiFilters "armeabi"
    }
    sourceSets{
        main{
            jni.srcDirs = []
            jniLibs.srcDir "src/main/libs"
        }
    }
}

5.根据cpp文件生成so文件


6. 调用

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView des = findViewById(R.id.des);
    des.setText(hello());
}


public static native String hello();

static {
    System.loadLibrary("hello-module");
}

7.show


<think>好的,用户现在想要了解如何使用Android NDK编译Hello World程序。之前他们问过如何编译MQTT库,所以可能已经对NDK有了些基础认识。不过这次是更基础的Hello World,可能需要从头开始讲解。 首先,我需要确定用户的背景。他们可能刚开始接触NDK,所以需要详细步骤,包括环境配置、代码编写、编译配置等。可能还需要解释些基本概念,比如JNI的作用,CMakeLists.txt的用途,以及如何将C/C++代码集成到Android应用中。 用户之前的MQTT库编译涉及交叉编译和复杂的配置,但Hello World更简单,应该避免复杂的内容,保持步骤清晰。需要确保每步都容易理解,比如安装NDK,配置项目结构,编写native代码,以及构建和运行。 可能需要注意用户的环境,比如是否已经安装了Android Studio和NDK,或者是否需要指导他们安装。在回答中应该包含安装步骤,但可能用户已经完成了这些,所以可能需要简要提及,或者提供检查方法。 另外,用户可能需要了解如何验证他们的配置是否正确,比如运行示例应用,查看Logcat输出。这部分需要给出明确的步骤,比如在哪里添加代码,如何构建APK,以及如何检查运行结果。 还应该考虑常见问题,比如NDK路径配置错误,CMake版本问题,或者ABI不匹配的情况。在指南中加入常见问题解决部分可以帮助用户自行排查问题。 最后,保持回答结构清晰,分步骤讲解,每个步骤都有明确的代码示例和说明,确保用户能够按部就班地完成整个过程。同时,语言要简洁,避免使用过于专业的术语,或者对术语进行适当的解释。</think>以下是使用 Android NDK 编译 "Hello World" 的完整指南,包含从环境配置到项目集成的全过程: --- ### **1. 环境准备** #### **1.1 安装必要组件** 1. 安装 Android Studio → SDK Manager → 勾选: - **NDK** (Native Development Kit) - **CMake** - **LLDB** (调试工具) 2. 验证安装: ```bash # 查看NDK版本 ls $ANDROID_HOME/ndk/*/source.properties ``` --- ### **2. 创建基础项目** #### **2.1 新建Native C++项目** 1. Android Studio → New Project → **Native C++** 模板 2. 选择 Minimum API Level ≥ 21 (建议选 API 24+ 以支持现代ABI) --- ### **3. 项目结构说明** 自动生成的关键文件: ``` app/ ├── src/main/ │ ├── cpp/ │ │ └── native-lib.cpp # JNI入口文件 │ └── java/ │ └── com/.../MainActivity.java ├── CMakeLists.txt # NDK编译配置文件 └── build.gradle # 构建配置 ``` --- ### **4. 编写JNI代码** 修改 `native-lib.cpp`: ```cpp #include <jni.h> #include <string> extern "C" JNIEXPORT jstring JNICALL Java_com_example_hellondk_MainActivity_stringFromJNI( JNIEnv* env, jobject /* this */) { std::string hello = "Hello from C++!"; return env->NewStringUTF(hello.c_str()); } ``` --- ### **5. CMake配置解析** 查看自动生成的 `CMakeLists.txt`: ```cmake cmake_minimum_required(VERSION 3.22.1) project("hellondk") add_library( native-lib # 生成的库名称 SHARED # 生成动态库(.so) native-lib.cpp # 源文件 ) find_library( log-lib # 引用Android日志库 log ) target_link_libraries( native-lib # 链接日志库 ${log-lib} ) ``` --- ### **6. Gradle配置要点** 查看 `build.gradle` 的关键配置: ```gradle android { defaultConfig { externalNativeBuild { cmake { cppFlags "-std=c++17" # 设置C++标准 abiFilters 'arm64-v8a', 'armeabi-v7a', 'x86_64' # 指定ABI } } } externalNativeBuild { cmake { path "CMakeLists.txt" # 指定CMake文件路径 version "3.22.1" } } } ``` --- ### **7. Java层调用示例** 修改 `MainActivity.java`: ```java public class MainActivity extends AppCompatActivity { static { System.loadLibrary("native-lib"); // 加载动态库 } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = findViewById(R.id.sample_text); tv.setText(stringFromJNI()); // 调用Native方法 } // Native方法声明 public native String stringFromJNI(); } ``` --- ### **8. 构建与调试** #### **8.1 编译命令** ```bash ./gradlew assembleDebug # 命令行编译 ``` 产物路径:`app/build/outputs/apk/debug/app-debug.apk` #### **8.2 查看编译产物** 解压 APK 可见: ``` lib/ ├── arm64-v8a/ │ └── libnative-lib.so # 64位ARM库 ├── armeabi-v7a/ └── x86_64/ ``` --- ### **9. 常见问题解决** #### **9.1 找不到JNI函数** ```log java.lang.UnsatisfiedLinkError: No implementation found for... ``` **解决方法**:检查以下三点: 1. 方法签名是否完全匹配(包名+类名+方法名) 2. `System.loadLibrary()` 参数是否去掉了 "lib" 前缀 3. C++ 函数是否使用 `extern "C"` 声明 #### **9.2 ABI兼容性问题** 在 `build.gradle` 中添加过滤: ```gradle android { defaultConfig { ndk { abiFilters 'arm64-v8a', 'x86_64' # 只编译指定架构 } } } ``` #### **9.3 添加日志输出** 修改 `native-lib.cpp`: ```cpp #include <android/log.h> #define TAG "NativeLog" #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__) extern "C" JNIEXPORT jstring JNICALL Java_com_example_hellondk_MainActivity_stringFromJNI(...) { LOGD("Native method called!"); // 添加日志 // ... } ``` --- ### **10. 手动编译(不使用Android Studio)** #### **10.1 创建独立工程** ```bash mkdir -p hellondk/jni cd hellondk ``` #### **10.2 编写Android.mk** `jni/Android.mk` 内容: ```makefile LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hellondk LOCAL_SRC_FILES := hellondk.c include $(BUILD_SHARED_LIBRARY) ``` #### **10.3 使用ndk-build编译** ```bash $ANDROID_NDK_HOME/ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./jni/Android.mk ``` --- ### **11. 性能优化建议** 1. **ABI精简**:仅保留目标设备架构(如只保留 arm64-v8a) 2. **编译选项**:在 `CMakeLists.txt` 中添加: ```cmake add_compile_options(-O2 -Wall) # 启用优化和警告 ``` 3. **符号隐藏**:减少导出符号提升安全性: ```cmake set(CMAKE_C_VISIBILITY_PRESET hidden) ``` --- 如果需要更深入的内容(如 JNI 高级用法、性能分析工具使用、混合调试技巧等),请告诉我具体方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值