概述:虽然ndk编译看起来原理简单,不过落实的时候遇到了各种问题,这里记录以下:
1. 下载和解压
cd /opt mkdir android-ndk sudo wget https://dl.google.com/android/repository/android-ndk-r23b-linux.zip sudo unzip android-ndk-r23b-linux.zip
2.设置环境变量
ln -s android-ndk-r23b ndk
在/etc/bash.bashrc后面追加:
# NDK export NDK_HOME=/home/peng/Desktop/eclipse_ndk/ndk export PATH=$NDK_HOME:$PATH echo "PATH is:$PATH.\n"
然后重新启动termianl,让PATH生效。
3. 编写ndk sample
目录结构如下:
peng@peng-Vbox:~/Desktop/eclipse-workspace$ tree . ├── Application.mk └── hello-jni ├── java │ └── com │ └── example │ └── hellojni │ └── HelloJni.kt └── jni(必须为jni,不然ndk-build不识别) ├── Android.mk └── hello-jni.c
Application.mk:
export NDK_PROJECT_PATH=/home/peng/Desktop/eclipse-workspace/hello-jni APP_PROJECT_PATH := $(NDK_PROJECT_PATH) APP_ABI := all
Android.mk:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := hello-jni.c include $(BUILD_SHARED_LIBRARY)
hello-jni.c:
/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include <string.h> #include <jni.h> /* This is a trivial JNI example where we use a native method * to return a new VM String. See the corresponding Java source * file located at: * * hello-jni/app/src/main/java/com/example/hellojni/HelloJni.java */ JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz ) { #if defined(__arm__) #if defined(__ARM_ARCH_7A__) #if defined(__ARM_NEON__) #if defined(__ARM_PCS_VFP) #define ABI "armeabi-v7a/NEON (hard-float)" #else #define ABI "armeabi-v7a/NEON" #endif #else #if defined(__ARM_PCS_VFP) #define ABI "armeabi-v7a (hard-float)" #else #define ABI "armeabi-v7a" #endif #endif #else #define ABI "armeabi" #endif #elif defined(__i386__) #define ABI "x86" #elif defined(__x86_64__) #define ABI "x86_64" #elif defined(__mips64) /* mips64el-* toolchain defines __mips__ too */ #define ABI "mips64" #elif defined(__mips__) #define ABI "mips" #elif defined(__aarch64__) #define ABI "arm64-v8a" #else #define ABI "unknown" #endif return (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI " ABI "."); }
4. ndk-build
export NDK_PROJECT_PATH=/home/peng/Desktop/eclipse-workspace/hello-jni
cd /home/peng/Desktop/eclipse-workspace/hello-jni
ndk-build NDK_LOG=1
编译成功。