用ndk环境编译android可用的so库
需求:由于算法人员已经用c++写好了接口,现在要迁移到Android上来,不可能让算法的代码在重新在androidstudio上在重新编写一遍,所以只能把现有的代码封装成android可调用的so库,然后利用JNI在封装成android可使用的接口
首先第一步我们来讲:如何使用ndk环境编译cpp源文件供Android调用
说明:Android上所用的so库必须在NDK环境下编译的才可以,我之前一直使用的是纯linux编译的do库,调用的时候一直报平台不兼容的错,后来才知道必须使用NDK环境编译的才可以,希望能帮助需要的人少走一些弯路,下面开始正经的了~
1)下载Android NDK,下载地址为:https://developer.android.google.cn/ndk/downloads/index.html ,目前最高的版本为android-ndk-r14b
2)将下载好的NDK随便解压缩到一个目录下,我的目录为:D:\updatendk\android-ndk-r14b
3)创建要编译的JNI目录,比如:D:\NDK-Build\jni,并将要编译的C++代码放入sourceCode文件夹下,比如:D:\NDK-Build\jni\sourceCode
4)在jni目录下创建android.mk和Application.mk文件
5)将build_native.bat脚本文件也放在跟jni平级的目录中去
其中:Android.mk文件的内容如下:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)LOCAL_MODULE := hello_sharedLOCAL_MODULE_FILENAME := libhello#设置可以使用C++代码LOCAL_CPPFLAGS += -std=c++11# 配置自己的源文件目录和源文件后缀名 MY_FILES_PATH := $(LOCAL_PATH) \ $(LOCAL_PATH)/../../ClientSocketEngineMY_FILES_SUFFIX := %.cpp %.cLOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)# 配置自己的源文件目录和源文件后缀名MY_FILES_PATH := $(LOCAL_PATH) \ $(LOCAL_PATH)/../../ClientSocketEngineMY_FILES_SUFFIX := %.cpp %.c# 递归遍历目录下的所有的文件rwildcard=$(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2)) ###################放置自己的cpp文件路径MY_SRC_LIST = $(LOCAL_PATH)/../../sourceCode\sayHelloWorld.cpp ################### # 去除字串的重复单词define uniq = $(eval seen :=) $(foreach _,$1,$(if $(filter $_,${seen}),,$(eval seen += $_))) ${seen}endef# 递归遍历获取所有目录MY_ALL_DIRS := $(dir $(foreach src_path,$(MY_FILES_PATH), $(call rwildcard,$(src_path),*/) ) )MY_ALL_DIRS := $(call uniq,$(MY_ALL_DIRS))# 赋值给NDK编译系统LOCAL_SRC_FILES := $(MY_SRC_LIST)#头文件路径指向 LOCAL_C_INCLUDES :=$(MY_ALL_DIRS) APP_ALLOW_MISSING_DEPS :=true include $(BUILD_SHARED_LIBRARY)
Appication.mk的文件内容如下:
APP_STL := gnustl_static APP_CPPFLAGS := -frtti -DCOCOS2D_DEBUG=1 -fexceptions
注意:NDK_ROOT是当前解压缩之后的ndk路径
@set "NDK_ROOT=D:\updatendk\android-ndk-r14b"@set "DIR=%cd%"@REM ... use paths relative to current directory@set "APP_ROOT=%DIR%/.."@set "APP_ANDROID_ROOT=%DIR%"@echo NDK_ROOT = %NDK_ROOT%@echo APP_ROOT = %APP_ROOT%@echo APP_ANDROID_ROOT = %APP_ANDROID_ROOT%@echo Using prebuilt externals@"%NDK_ROOT%/ndk-build.cmd" pause
6)执行bat脚本:
成功之后会在jni平级的目录中会新增加libs和obj文件夹,其中libs文件夹下就是要生成的对应android平台的libhello.so文件
so库编译成功之后就可以放入androidstudio环境中用jni调用了,调用步骤我们下篇文章继续讲述~
更多相关文章
- 使用android上传文件
- Android:Resources资源文件
- Android应用程序的数据存放目录 路径
- Android Studio 之 AndroidManifest.xml文件中的android:label属
- Android一级目录介绍
- android 创建文件夹失败