机器配置不行,这里就不用AndroidStudio了,只是用下它里面的NDK。没必要专门去官网下载一个NDK!因为AndroidStudio本身是自带有NDK的。
在自带的NDK里面有个ndk_helper目录,除了Android.mk文件,还有一些示例。我这里只取三个文件作修改后即可用。
在ndk-bundle下新建一个名为jni的目录,将上面的这些文件都复制一份到里面。这是因为从NDK-R4开始,只需将文件放在jni下即可执行。为了能编译通过,先将复制过来的JNIHelper文件里面的代码都删掉,只留必要的日志、构造函数等。
必须起名为jni,否则在编译的时候会抛错误信息:
Could not find application project directory !
Please define the NDK_PROJECT_PATH variable to point to it.
Android.mk
#每个Android.mk文件都必须以LOCAL_PATH开始,my-dir返回包含Android.mk的目录路径
LOCAL_PATH:= $(call my-dir)
#负责清理一些LOCAL_XXX,但不清理LOCAL_PATH,这个清理动作是必须的
include $(CLEAR_VARS)
#必须定义,以表示Android.mk中的每个模块的名字,不能有空格.例如这里为ndk_helper,则生成的so名字为libndk_hepler.so
LOCAL_MODULE:= ndk_helper
#必须定义,以表示要打包的C/C++文件,多个文件空格隔开
LOCAL_SRC_FILES:= JNIHelper.cpp
#表示动态编译库,也就是生成so
include $(BUILD_SHARED_LIBRARY)
这里面是没有Application.mk的,手动建一个
#使用的NDK库版本号,一般和SDK对应,各个版本在platforms目录下
APP_PLATFORM = android-27
#不写APP_ABI就生成全部支持的平台,目前支持:armeabi、arm64-v8a、armeabi-v7a
#APP_ABI := armeabi arm64-v8a armeabi-v7a
#如何链接C++标准库,stlport_static表示静态链接、stlport_shared表示动态链接
APP_STL := c++_static
#编译为release版本
#APP_OPTIM := release
JNIHelper.h
#pragma once
#include <jni.h>
#include <vector>
#include <string>
#include <android/log.h>
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, ndk_helper::JNIHelper::GetInstance()->GetAppName(), __VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, ndk_helper::JNIHelper::GetInstance()->GetAppName(), __VA_ARGS__))
#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, ndk_helper::JNIHelper::GetInstance()->GetAppName(), __VA_ARGS__))
namespace ndk_helper
{
class JNIHelper
{
private:
JNIHelper();
~JNIHelper();
};
}
JNIHelper.cpp
#include <iostream>
#include "JNIHelper.h"
namespace ndk_helper
{
JNIHelper::JNIHelper()
{
}
JNIHelper::~JNIHelper()
{
}
}
cd到jni里面ndk-build即可
成功,SO所在路径