返回

安卓应用上的C语言妙用—Android.mk秘籍大放送!

Android

使用 NDK 编译:让 C/C++ 程序在 Android 设备上闪耀

初探 NDK 编译

对于 Android 开发人员而言,Java 始终是语言首选。然而,在某些情况下,例如需要开发图形密集型应用程序时,C/C++ 的优势就凸显出来了。NDK(Native Development Kit)应运而生,它允许开发人员使用 C/C++ 语言编写代码并在 Android 设备上运行。

准备就绪

踏上 NDK 编译之旅之前,需要准备好以下工具:

  • Android Studio(包含 NDK)
  • NDK 工具链
  • 文本编辑器(如 Vim、Emacs 或 Sublime Text)
  • Android 设备或模拟器

创建 NDK 项目

首先,在 Android Studio 中创建一个新的 Android 项目。在项目中,创建名为“jni”的文件夹,用于存放 C/C++ 代码和相关文件。

配置 NDK

打开项目目录下的“build.gradle”文件,在“defaultConfig”块中添加以下代码:

externalNativeBuild {
    ndkBuild {
        path "jni/Android.mk"
    }
}

这行代码告诉 Android Studio 在构建项目时使用 NDK 编译“jni/Android.mk”文件。

创建 Android.mk 文件

在“jni”文件夹下创建一个名为“Android.mk”的文件。这个文件用于定义编译规则。以下是 Android.mk 文件的基本结构:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := hello

LOCAL_SRC_FILES := hello.c

include $(BUILD_SHARED_LIBRARY)

LOCAL_PATH:指定当前目录的路径。
LOCAL_MODULE:指定库的名称。
LOCAL_SRC_FILES:指定源文件的列表。
LOCAL_STATIC_LIBRARY:指定要构建一个静态库。
LOCAL_SHARED_LIBRARY:指定要构建一个共享库。

编写 C/C++ 代码

在“jni”文件夹下创建你要编译的 C/C++ 源文件,例如“hello.c”。

#include <stdio.h>

JNIEXPORT jstring JNICALL Java_com_example_hello_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    return (*env)->NewStringUTF(env, "Hello from C/C++!");
}

构建项目

点击 Android Studio 中的“Run”按钮,选择“Run App”。项目将在真机或模拟器上运行。

在 Java 代码中调用 C/C++ 代码

在 Java 代码中,可以使用 JNI(Java Native Interface)来调用 C/C++ 代码。以下是如何在 MainActivity.java 中调用 C/C++ 代码:

public class MainActivity extends AppCompatActivity {

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

    public native String stringFromJNI();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Call C/C++ function
        String hello = stringFromJNI();
        Log.d("MainActivity", hello);
    }
}

NDK 编译 C/C++ 程序常见问题解答

问:如何在真机上运行 NDK 编译的应用程序?

答:确保已将 Android 设备连接到计算机并启用 USB 调试。在 Android Studio 中,选择正确的设备目标并单击“Run”按钮。

问:出现“找不到 NDK 工具链”错误怎么办?

答:检查 NDK 工具链路径是否已正确配置。可以转到“文件”->“设置”->“工具”->“NDK”来验证路径。

问:如何调试 NDK 应用程序?

答:使用 Android Studio 集成的调试工具。可以在“Run”->“Debug”中设置断点并逐步执行代码。

问:如何提高 NDK 应用程序的性能?

答:使用 C/C++ 优化技术,例如内联函数、优化编译器标志和避免不必要的内存分配。

问:如何分发包含 NDK 代码的 Android 应用程序?

答:将“jniLibs”文件夹包含在应用程序的 APK 中。这个文件夹应该包含所有针对不同 CPU 架构编译的库。