只使用NDK将C/C++编译成SO

机器配置不行,这里就不用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所在路径

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值