NDK(三方库引入、Mk文件)
NDK笔记-----第三方库引入
一、字符操作: 1
二、NDK*(JNI)对象操作: 2
1、C++调用java对象 3
三、Android.mk说明: 3
四、Application.mk说明 3
五、第三方库使用 4
1、动态库 4
1.1、使用NDK编译动态库并使用: 4
1.2、使用编译好的动态库: 6
2、静态库 7
2.1、NDK编译静态库 7
2.1、使用已有的静态库: 7
注意:
C++:
Android项目:
Jni-c++源文件
方法:extern "C" {}包裹;
或 使用宏修饰。C不需要
头文件 cmd:javah-全类名。 会在环境变量classpath中查找依赖的类
一、字符操作:
Java传递的jstring字符串无法直接在native使用,需要转换。
使用GetStringUFTChars得到const char * 有时无法满足操作。

#注意释放资源
Malloc表示申请固定内存。而new会直接调用构造创建,不需要手动申请内存。
Malloc对应free; char* X = new char[10] 对应 delete X;
C++获取字符串指针操作
string to const char* ======== .c_str() .data();
const char*、char* to string ===== string 变量(char)
const
C++内存分配:

对于非指针
|
const TYPE value; 它的含义是:const修饰的类型为TYPE的变量value是不可变的(只读)。 |
对于指针
如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量; A:指向常量(ps:改变只报警告) B:指针为常量,不能改变指向。 |
倒过来读:
Char* 指向字符【的指针】
Char* const 常量(静态指针)指向字符,即指向不可变
Const char* 指向字符常量【的指针】
二、NDK*(JNI)对象操作:

查看签名:进入到类文件所在目录
Javap –s 类名
1、C++调用java对象

三、Android.mk说明:
LOCAL_PATH := $(call my-dir) 包含Android.mk file文件的目录
include $(CLEAR_VARS) 清除LOCAL_XXX变量
LOCAL_MODULE := json 文件名(不含后缀和lib)
LOCAL_SRC_FILES := lib/libjson.a 文件路径
include $(PREBUILT_STATIC_LIBRARY) 预加载静态库
LOCAL_STATIC_LIBRARIES := json 使用静态库
LOCAL_LDLIBS := -llog 使用库(动静)
include $(BUILD_SHARED_LIBRARY) 共享库(动态库)
include $(BUILD_STATIC_LIBRARY) 静态库
注意:第三方库的引入会在ndk目录下查找,所以当库不存在时需要指明查找路径。
如果已经定义好了库模块同时使用LOCAL_STATIC(SHARED)_LIBRIRES导入只 需要 :=模块名
四、Application.mk说明
放入myapp/jin/application.mk或myapp/application.mk
APP_PROJECT_PATH := 应用程序工程根目录的绝对路径jni下可选
APP_ABI := armeabi-v7a支持ARMv7 armeabi支持ARMv5
APP_CPPFLAGS +=-fexceptions 开启exception会根据application 的debug节点
NDK构建系统提供由Android系统给出的最小C++运行时库
指定:
头文件引入:
APP_STL := stlport_static --> static STLport library
APP_STL := stlport_static --> 静态STLport库
APP_STL := stlport_shared --> shared STLport library
APP_STL := stlport_shared --> 动态STLport库
APP_STL := system --> default C++ runtime library
APP_STL := system --> 默认的C++运行时库
gnustl_static ----- 标准STL c++库
Jsoncpp+NDK目录:

五、第三方库使用
1、动态库
---------------------------------jsoncpp动态库-----------------------------------------
1.1、使用NDK编译动态库并使用:
jsoncpp-src-0.6.0-rc2-amalgamation.tar ---- .h、.app混合版

Jsoncpp解压---jni/文件名/解压文件
Android.mk:

Test:测试
Android.mk:

Jin:
Android.mk

合并一个Android.mk

1.2、使用编译好的动态库:
动态库放入jni/XX文件下


2、静态库
------------------------------------------静态库----------------------------------------------
2.1、NDK编译静态库
注意:NDK编译的静态库会存在与

编译好后直接使用

2.1、使用已有的静态库:
将需要的静态库放入jni下


六、资源释放:
1、字符串
env->ReleaseStringUTFChars(jstr, jcstr);
Jstr-----jstring类型
Jcstr----jstring的引用
如:

Jstr是jstring类型,是来源。
释放类、方法和对象(jstring是对象,不是基本数据类型)

演示JSONCPP使用:


Value root: Jsoncpp对象,这里使用Reader会出错。
资源被释放又传递回java


GDB调试

Cygwin ------ cd 工程 -----ndk-gdb(未启动加上 --start)
file 工程obj下的so
NDK(三方库引入、Mk文件)的更多相关文章
- Android NDK开发之Android.mk文件
Android NDK开发指南---Android.mk文件 博客分类: Android NDK开发指南 Android.mk文件语法详述 介绍: ------------ 这篇文档是用来描述你的 ...
- NDK开发之Application.mk文件详解
做过NDK开发的同学应该都知道有个Application.mk文件,这是android NDK构建系统使用的一个可选构建文件.它的目的是描述应用程序需要哪些模块,也定义了所有模块的一些通用变量.主要有 ...
- Android NDK开发指南---Application.mk文件和android.mk文件
https://android.googlesource.com/platform/development/+/donut-release/ndk/docs/OVERVIEW.TXT https:// ...
- ubuntu下编译android jni到so库的mk文件配置
项目根目录下的Android.mk文件 LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional L ...
- 使用cocoapods后 三方库的头文件没有代码提示?
选择Target -> Build Settings 菜单,找到\”User Header Search Paths\”设置项 新增一个值"${SRCROOT}",并且选择\ ...
- Android.mk文件官方使用说明
本页介绍了 ndk-build 所使用的 Android.mk 编译文件的语法. 概览 Android.mk 文件位于项目 jni/ 目录的子目录中,用于向编译系统描述源文件和共享库.它实际上是编译系 ...
- AndroidStudio中添加依赖的三种方式以及如何引入so文件和arr文件
AndroidStudio中添加依赖的三个选项,如图: 分别为:库依赖(Library dependency).文件依赖(File dependency)和module依赖(Module dep ...
- 使用其他服务器引入JS文件
使用其他服务器引入JS文件,1,减轻服务器压力2,速度快3,可以缓存 cdnjs库,更新比较快https://cdnjs.com/ cdn库 引入JS文件如:jquerybootcdn : https ...
- 关于swift使用CocoaPods倒入三方库的framework后父类倒入子类无法继承的问题
今天开发项目的时候遇到这么一个问题在使用cocoapods倒入了三方库后我在BaseController中倒入三方库,其余controller继承自basecontroller,然而在继承的子类中无法 ...
随机推荐
- netty 对 protobuf 协议的解码与包装探究(2)
netty 默认支持protobuf 的封装与解码,如果通信双方都使用netty则没有什么障碍,但如果客户端是其它语言(C#)则需要自己仿写与netty一致的方式(解码+封装),提前是必须很了解net ...
- SourceTree 将本地已有的git项目推送到远程git仓库
1.在远程git仓库创建对应的项目: 2.用命令行生成本地的ssh key; 3.把公钥粘贴远程仓库对应的位置: 4.SourceTree 设置远程仓库的地址: 5.把本地对应的分支推送到远程仓库: ...
- MySQL插入数据中文乱码问题的解决
一.使用语句 show variables like 'character%'; 来查看当前数据库的相关编码集. 1.启动cmd,登录mysql ①cd C:\Program Files\MySQL\ ...
- W3Cschool学习笔记——HTML基础教程
什么是 HTML? HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 (ma ...
- JavaScript———从setTimeout与setInterval到AJAX异步
setTimeout与setInterval执行 首先我们看一下以下代码打印结果 console.log(1); setTimeout(function() { console.log(2); },1 ...
- ArcGIS Desktop 10.5 安装实录
ArcGIS Desktop 10.5 安装实录 by 李远祥 几天前已经收到ArcGIS10.5的最终版安装介质,终于有时间可以安装一下.尽管ArcGIS10.5系列中,桌面软件不是主角,但笔者还是 ...
- css3 3D效果
css3 3D变形 transfrom初学 这个礼拜学了css3 3d,感觉到css无穷的魅力,可以通过几个特定的代码符号创建出3D效果的页面. ___ 透视 一个元素需要一个透视点才能激活3D空间, ...
- 解决npm install安装了太多架包的问题
比如我安装gulp时,会多出很多无用的包,如下图: 经过查询,原来是npm升级了导致的,在npm3.0以上的版本,包的依赖不再安装在每个架包的node_modules文件夹内,而是安装在顶层的node ...
- PropertyChangeSupport的使用
使用目的 当你需要监听对象属性的变化时,可以使用PropertyChangeSupport类来管理监听器,可以在一些关联属性的场合使用. 使用示例,以下为BetaConfig对象添加了管理属性监听器的 ...
- ubuntu中的apache的基本技巧
1. 显示apache的版本号 XXX@XXX-ThinkPad-Edge-E431:~$ apache2 -v Server version: Apache/ (Ubuntu) Server bui ...