ndkbuild 记录

概述:虽然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

编译成功。




原文地址:https://www.cnblogs.com/hkingsp/p/15788407.html