Getting started
Project structure
A typical ndk-build project structure:The
jni/ directory is the default location for ndk-build files, but you can customize this in your Gradle configuration.Basic setup
1
Create the jni directory
Create a
jni/ directory in your module’s src/main/ folder:2
Create Android.mk
Define your native modules in
Android.mk:Android.mk
3
Create Application.mk (optional)
Configure project-wide settings:
Application.mk
4
Configure Gradle
Link ndk-build in your
build.gradle:build.gradle
Android.mk file
The Android.mk file defines one or more native modules using GNU Make syntax.Required variables
Every Android.mk must set these variables:Android.mk
Common variables
- Source files
- Include paths
- Compiler flags
- Dependencies
Module types
Multiple modules
Define multiple modules in a single Android.mk:Android.mk
Application.mk file
The Application.mk file configures project-wide build settings.Common settings
Application.mk
STL selection
- c++_static
- none
ABI configuration
Application.mk
Google Play requires 64-bit support for all apps with native code. Always include arm64-v8a and x86_64.
NDK variables
ndk-build provides many built-in variables:Path variables
Utility functions
Advanced usage
Conditional compilation
Android.mk
Debug vs release builds
Android.mk
Using NDK modules
Import prebuilt NDK modules like native_app_glue:Android.mk
Building from command line
You can build directly with ndk-build (without Gradle):When using Gradle integration, you typically don’t need to run ndk-build directly. Gradle invokes it automatically during the build process.
Common issues
Undefined references
- Ensure all required source files are in
LOCAL_SRC_FILES - Add dependencies to
LOCAL_SHARED_LIBRARIESorLOCAL_STATIC_LIBRARIES - Check that library order is correct (dependencies listed after libraries that use them)
Wrong STL
APP_STL := c++_shared in Application.mk
ABI mismatch
Next steps
Gradle integration
Configure ndk-build in your Gradle build
CMake
Consider migrating to CMake for cross-platform projects
ABIs
Learn about Android binary interfaces
Debugging
Debug your native code