需求:由于算法人员已经用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


build_native.bat脚本内容如下:

注意: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平级的目录中会新增加libsobj文件夹,其中libs文件夹下就是要生成的对应android平台的libhello.so文件

so库编译成功之后就可以放入androidstudio环境中用jni调用了,调用步骤我们下篇文章继续讲述~

更多相关文章

  1. 使用android上传文件
  2. Android:Resources资源文件
  3. Android应用程序的数据存放目录 路径
  4. Android Studio 之 AndroidManifest.xml文件中的android:label属
  5. Android一级目录介绍
  6. android 创建文件夹失败

随机推荐

  1. Android 禁止输入emoji表情符号
  2. 130292015044 上官伟 第一章作业
  3. 利用productFlavors实现一套代码打包多版
  4. Android Studio升级3.5.0总结
  5. android的MultiAutoCompleteTextView、Au
  6. Android 监听开机广播启动服务 动态注册
  7. android button设置边框背景颜色
  8. Android中程序与Service交互的方式——交
  9. Android基础(一) ImageButton
  10. Android(安卓)显示Intent和隐示Intent