NDK(三方库引入、Mk文件)

 

NDK笔记-----第三方库引入

一、字符操作: 1

二、NDK*(JNI)对象操作: 2

1C++调用java对象 3

三、Android.mk说明: 3

四、Application.mk说明 3

五、第三方库使用 4

1、动态库 4

1.1、使用NDK编译动态库并使用: 4

1.2、使用编译好的动态库: 6

2、静态库 7

2.1NDK编译静态库 7

2.1、使用已有的静态库: 7

 

注意:

C++:

Android项目:

Jni-c++源文件

方法:extern "C" {}包裹;

或  使用宏修饰。C不需要

头文件 cmdjavah-全类名。 会在环境变量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;
TYPE const value;
这两种写法在本质上是一样的。

它的含义是:const修饰的类型为TYPE的变量value是不可变的(只读)。

 

 

 

对于指针

  1. const char *pContent;
    B. char * const pContent;
    C. char const *pContent;
    D. const char* const pContent;

如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。

A:指向常量(ps:改变只报警告)

B:指针为常量,不能改变指向。

 

倒过来读:

Char*   指向字符【的指针】

Char* const  常量(静态指针)指向字符,即指向不可变

Const char*   指向字符常量【的指针】

 

二、NDK*(JNI)对象操作:

 

查看签名:进入到类文件所在目录

Javap –s 类名

 

1C++调用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.mkmyapp/application.mk

 

APP_PROJECT_PATH :=  应用程序工程根目录的绝对路径jni下可选

APP_ABI := armeabi-v7a支持ARMv7  armeabi支持ARMv5

APP_CPPFLAGS +=-fexceptions  开启exception会根据applicationdebug节点

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.1NDK编译静态库

注意:NDK编译的静态库会存在与

 

编译好后直接使用

 

2.1、使用已有的静态库:

将需要的静态库放入jni

 

 

 

六、资源释放:

1、字符串

env->ReleaseStringUTFChars(jstr, jcstr);

Jstr-----jstring类型

Jcstr----jstring的引用

如:

 

Jstrjstring类型,是来源。

 

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

 

 

 

演示JSONCPP使用:

 

 

Value root: Jsoncpp对象,这里使用Reader会出错。

 

资源被释放又传递回java

 

 

 

GDB调试

 

Cygwin ------ cd 工程 -----ndk-gdb(未启动加上 --start

 file 工程obj下的so

posted @ 2014-01-20 20:16  w愿得一人心  阅读(1823)  评论(0编辑  收藏  举报