protobuf使用NDK编译Android的静态库(工作记录)
1.protobuf 编译过程
- 前提: 确保自己电脑上已经安装了cygwin + ndk, 并且NDK能够编译hello-jni成功
1.1 把protobuf 压缩包解压到protobuf文件夹下
1.2 在protobuf文件夹下新建jni文件下
1.3 把protobuf文件夹下的src文件夹复制一份到jni文件夹下
1.4 在jni文件夹下新建Android.mk文件并且在里面添加如下内容
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := protobuf
LOCAL_MODULE_FILENAME := libprotobuf
LOCAL_SRC_FILES := src/google/protobuf/io/coded_stream.cc \
src/google/protobuf/stubs/common.cc \
src/google/protobuf/descriptor.cc \
src/google/protobuf/descriptor.pb.cc \
src/google/protobuf/descriptor_database.cc \
src/google/protobuf/dynamic_message.cc \
src/google/protobuf/extension_set.cc \
src/google/protobuf/extension_set_heavy.cc \
src/google/protobuf/generated_message_reflection.cc \
src/google/protobuf/generated_message_util.cc \
src/google/protobuf/io/gzip_stream.cc \
src/google/protobuf/compiler/importer.cc \
src/google/protobuf/message.cc \
src/google/protobuf/message_lite.cc \
src/google/protobuf/stubs/once.cc \
src/google/protobuf/compiler/parser.cc \
src/google/protobuf/io/printer.cc \
src/google/protobuf/reflection_ops.cc \
src/google/protobuf/repeated_field.cc \
src/google/protobuf/service.cc \
src/google/protobuf/stubs/structurally_valid.cc \
src/google/protobuf/stubs/strutil.cc \
src/google/protobuf/stubs/substitute.cc \
src/google/protobuf/text_format.cc \
src/google/protobuf/io/tokenizer.cc \
src/google/protobuf/unknown_field_set.cc \
src/google/protobuf/wire_format.cc \
src/google/protobuf/wire_format_lite.cc \
src/google/protobuf/io/zero_copy_stream.cc \
src/google/protobuf/io/zero_copy_stream_impl.cc \
src/google/protobuf/io/zero_copy_stream_impl_lite.cc \
src/google/protobuf/stubs/stringprintf.cc
LOCAL_EXPORT_C_INCLUDES :=
LOCAL_EXPORT_LDLIBS :=
LOCAL_C_INCLUDES := $(LOCAL_PATH) \
$(LOCAL_PATH)/src
LOCAL_LDLIBS := -llog -lz
include $(BUILD_STATIC_LIBRARY)
1.5 在jni文件夹下新建Application.mk文件并且在里面添加如下内容
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti
APP_ABI := armeabi armeabi-v7a x86
APP_MODULES := protobuf
- 这里我弄了很久,原因是在cygwin中用ndk-build一直没有反应,但是hello-jni又是有效的,后来在stackoverflow中看到说如果使用NDK编译静态
库要在Application. :mk中添加APP_MODULES := module_name否则无法编译,动态库可以不用这个,简单的甚至不用Application.mk这个文件
1.6 使用cygwin 进入到protobuf文件夹,然后输入 ./configure
1.7 把上一步生成的config.h文件拷贝到jni文件下
1.8 在protobuf文件夹下运行ndk-build命令生成静态库文件,并且把静态库文件拷贝到我们项目下的libs文件夹下,比如反正proto文件夹下
proto 文件夹结构:
根目录:proto
一级子目录和文件:include,libs文件夹已经Android.mk文件
1.9 在protobuf文件夹下运行make && make install
1.10 实际上在1.9中也会生成libprotobuf.a文件,但是我主要是用来提取头文件,因为make install会把生成的lib文件和需要使用的头文件分别安装到cygwin的/usr/local/lib和usr/local/include其中include文件夹下的文件是我们需要的,把include文件夹放到1.8的proto文件夹下
1.11 在proto文件夹下创建一个Android.mk文件,内容如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := cocos_protobuf_static
LOCAL_MODULE_FILENAME := libprotobuf
LOCAL_SRC_FILES := libs/$(TARGET_ARCH_ABI)/libprotobuf.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY)
2.protobuf 使用过程
2.1 在自己工程的Android.mk文件中添加以下代码
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_protobuf_static
$(call import-add-path,$(LOCAL_PATH)/../../)
$(call import-module,proto)
- cocos_protobuf_static这个是1.11的LOCAL_MODULE
- $(LOCAL_PATH)/../../这个路径是1.8的proto文件夹上一层路径
- proto就是1.8的proto文件夹
protobuf使用NDK编译Android的静态库(工作记录)的更多相关文章
- android开发 NDK 编译和使用静态库、动态库 (转)
在eclipse工程目录下建立一个jni的文件夹 在jni文件夹中建立Android.mk和Application.mk文件 Android.mk文件: Android提供的一种makefile文件, ...
- ndk编译android的lame库
1.lame c库: https://github.com/intervigilium/liblame 下载后解压,进入目录,terminal里运行ndk-build即可 2.lame android ...
- Android NDK生成及连接静态库与动态库
对于Android应用开发,大部分情况下我们使用Java就能完整地实现一个应用.但是在某些情况下,我们需要借助C/C++来写JNI本地代码.比如,在使用跨平台的第三方库的时候:为了提升密集计算性能的时 ...
- Android APP使用NDK编译后的ffmpeg库出现undefined reference to 'posix_memalign'错误
在android程序中使用NDK编译后的ffmpeg库的时候出现了如下错误: jni/libs/libavutil.a(mem.o): in function av_malloc:libavutil/ ...
- NDK jni 加载静态库
加载静态库到android,静态库的提供方式有2种, a. 通过源文件来编译静态库 b. 加载已经编译好的静态库 首先我们来看,通过源文件来编译静态库,工程目录如下 第一步:我们来看我们的jni目录, ...
- iOS——为Xcode编译POCO C++静态库
一.POCO C++ library简介 POCO C++ library是一个C++编写的跨平台库,主要实现网络连接.数据库管理以及服务器,适用于跨平台.嵌入式. 二.为Xcode编译POCO C+ ...
- iOS - 编译WebRTC.a静态库
编译WebRTC.a静态库 编译的方式,我看了几个帖子,什么方法都有,这里我根据我的需求,说说我的做法.我的主要目的是因为网上找不到.a模式的webrtc的静态库,都是framework,所以我才自己 ...
- ndk学习7: 使用静态库
目录: 手工编译静态库 ndk-build编译静态库 手工编译静态库 老规矩还是先手工操作,知其然并知其所以然 需要用到的核心命令: gcc –g –c mod1.c mod2.c mod3. ...
- FFmpeg笔记:使用MSVC工具链编译Windows版本静态库、动态库
2019年3月开始,为了将音视频编解码功能集成到Cocos2d-x中,开始接触到FFmpeg: 当时开发环境还在Mac下,编译FFmpeg相比现在用Windows平台要方便的多: 最近,公司内部有个U ...
随机推荐
- C#字符串转INT
Convent.ToInt32(string ) 可以转化字符串 其他 * .tostring(); (int ) char //强制类型转换 不能转化字符串
- php基本(四)表单验证
本文内容来自http://www.w3school.com.cn/php/php_form_url_email.asp PHP 表单验证 - 验证 E-mail 和 URL 本节展示如何验证名字.电邮 ...
- delphi edit 中undo 和clearundo 复制粘贴等总结
edit 和memo都有undo功能, Undo:恢复到改动前. ClearUndo:撤销掉Undo缓冲区的内容,则将无法恢复到改动前的 从该文本框的撤销缓冲区中清除关于最近操作的信息,根据应用 程序 ...
- 希望获取到页面中所有的checkbox怎么做?
var domList = document.getElementsByTagName(‘input’); var checkBoxList = []; var len = domList.lengt ...
- java innerclass
---恢复内容开始--- 内部类: public class Inner{ public class Inner2{} } 创建内部类对象 .new public class Test { in ...
- Python 学习笔记8
在最想放弃的时候 想想美好的事情 想想明天. 今天继续看错误与异常. http://www.pythondoc.com/pythontutorial3/errors.html
- Python 学习笔记7
今天很残酷,明天很残酷,后天很美好.但绝大多数人会死在明天的路上.只有真正的勇士才能看到后天的太阳! Python学习是枯燥的.但是一定要坚持! 昨天学习了数据结构和模块. 今天学习输入和输出.错误与 ...
- docker中管理数据
到目前我们介绍了一些Docker的基础概念, 知道了如何使用Docker的image, 也知道了如何在多个container间通过网络通讯. 在这章里我们将介绍如何在docker的container内 ...
- 一个初学者的辛酸路程-了解Python-2
前言 blog花了一上午写的,结果笔记本关机了,没有保存,找不到了,找不到了啊,所以说,你看的每一篇blog可能都是我写了2次以上的--.哎!! 代码改变世界,继续......... Python基础 ...
- PHP7编译错误:php编译undefined reference to `libiconv 错误
ext/gd/libgd/.libs/gdkanji.o: In function `do_convert’: /root/php-5.2.12/ext/gd/libgd/gdkanji.c:350: ...