Android NDK的使用

1.ndk环境搭建

.tar.gz     格式解压为          tar   -zxvf   xx.tar.gz

.tar.bz2   格式解压为          tar   -jxvf    xx.tar.bz2

http://googlers.iteye.com/blog/977150

2.ndk编译

进入到/jni目录直接执行

# ndk-build

生成so库

执行ndk-build的时候,其实是执行make -f $NDK/build/core/build-local.mk这个脚本

执行ndk-build之后会在上级目录生成libs和obj目录

脚本分析见下载下来的ndk中docs目录下的文档(主要是NDK programmer's Guide这个html文档):

在android-ndk-r4b-linux-x86/docs/NDK-BUILD.TXT中有说明ndk-build的其他带参数使用方法及ndk-build命令的实质:

'ndk-build' itself is a tiny wrapper around GNU Make, its purpose is simply
to invoke the right NDK build script, it is equivalent to;

    $GNUMAKE -f $NDK/build/core/build-local.mk [parameters]


ndk-build 其实就是对GNU Make的封装,它的目的是调用正确的NDK编译脚本,它等价于 make -f $NDK/build/core/build-local.mk [参数]

(以后自己学习制作命令,并分析清楚这个脚本到底做了些什么,怎么调用到jni目录下的Android.mk的)

3.编译脚本:

 
LOCAL_PATH:=$(call my-dir)

#version
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= dongleVersion.cpp
LOCAL_MODULE_TAGS := optional 
LOCAL_CFLAGS := -DRIL_SHLIB -D_DEBUG -DANDROID_DEBUG
LOCAL_LDLIBS := -L. -L$(LOCAL_PATH)/../systemlibs -llog -liflytekdongle
LOCAL_MODULE:=dongle_version

include $(BUILD_EXECUTABLE)

编译得到可执行文件:

Install        : dongle_version => /home/duanliang/ndk/dongle_burn/libs/armeabi

4.ndk在Android体系中的作用

我们可以先拿到第三方的库,然后自己写jni程序,将这个库封装出自己的一层接口,形成诸如:dongle_burn这种自己的so库,然后就可以方便地供java程序调用。


常规设计是编译出so库,由Android应用load这些so库,最后通过jni调用

这里是直接编译出可执行程序,然后由Android应用通过执行这些应用程序来完成需要的功能。在Android中牵涉到底层的一些实现通常也采取这种方式。



nkd编程tips:

1.文件的最开头都要写上,文件名,文件内容,作者,时间,版本等信息,便于用工具生成文档

/*********************

Filename    :   ****
Content     :   ****
Created     :   ****
Authors     :   ****

Copyright   :   Copyright 2015 *** All Rights reserved.

*********************/

2.头文件中的开头和结尾都用宏定义防止重复编译,并且在#endif后注释是哪一段代码的结束,便于阅读

#ifndef OVR_VrApi_Config_h
#define OVR_VrApi_Config_h

....
....

#endif	// !OVR_VrApi_Config_h

3.在一个版本头文件中定义版本

#ifndef OVR_VrApi_Version_h
#define OVR_VrApi_Version_h

// At some point we will transition to product version 1 
// and reset the major version back to 1 (first product release, version 1.0).
#define VRAPI_PRODUCT_VERSION	0
#define VRAPI_MAJOR_VERSION		6
#define VRAPI_MINOR_VERSION		1
#define VRAPI_PATCH_VERSION		0
#define VRAPI_BUILD_VERSION		0

#endif	// OVR_VrApi_Version_h


4.在Types中定义一些会用到的机构体,这里部分和环境相关的用宏定义分开

#if defined( ANDROID )
#include <jni.h>
#elif defined( __cplusplus )
typedef struct _JNIEnv JNIEnv;
typedef struct _JavaVM JavaVM;
typedef class _jobject * jobject;
#else
typedef const struct JNINativeInterface * JNIEnv;
typedef const struct JNIInvokeInterface * JavaVM;
void * jobject;
#endif


5.公共的脚本配置可以写到一个.mk中,然后在需要的地方include进来就是,这样可以使得.mk脚本更为简洁和便于阅读

include $(LOCAL_PATH)/../../../../../cflags.mk









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值