Android NDK : 自己动手做so库

来源:互联网 发布:手机上传淘宝主图视频 编辑:程序博客网 时间:2024/06/06 08:51

Android NDK : 自己动手做so库

前言 :

在上一篇Android NDK : NDK开发概要 中大体记录了下Android NDK的概念,工具包以及简单了自动编译链接实现了一个hello NDK的小demo 。
现在让我们不使用NDK的自动编译链接的功能,来自己一步步的实现前面的小demo 。即亲自动手来实现我们的动态链接库 。

创建要调用本地代码的java类:

首先在我们的android项目工程中的src目录下编写要调用native的Java类 ,

package com.cumt.ndktest2;public class HelloAndroidNDK {static{//加载本地的c库文件System.loadLibrary("helloAndroidNDK");}//声明c库中的本地方法public native String sayHelloToNDK();}

写好后ctrl + S 保存后就会自动在bin目录下的class文件夹下生成一个.class文件,如图所示:


接下来我们就利用这个文件来生成我们所需要的头文件

生成本地代码的头文件:

在android项目工程的根目录下新建一个jni文件夹,我们准备将生成后的头文件放在这个文件夹下 。
然后在dos中通过javah命令生成头文件 (如果你找不到javah指令那是没有配置环境变量的原因,javah指令在java的jdk的bin目录下)
javah使用方法如图所示:



此时在jni目录下就生出了头文件,在eclipse中refresh一下jni文件夹就可以看到了 :



在上一节中已经说过命名的格式,这里就不再说了。下面我们就可以让其他成员根据这个头文件和需求编写C/C++的代码,生成动态库,
再给我们使用(在具体工作中)。现在我们来自己实现这个函数 。

根据头文件编写本地代码:

//com_cumt_ndktest2_HelloAndroidNDK.c#include "com_cumt_ndktest2_HelloAndroidNDK.h"JNIEXPORT jstring JNICALL Java_com_cumt_ndktest2_HelloAndroidNDK_sayHelloToNDK  (JNIEnv *env, jobject thiz){return (*env)->NewStringUTF(env,"Hello Android NDK");}

我们返回一个字符串:“Hello Android NDK” 。

makefile文件编写:

现在开始编写makefile文件 ,其实原理和linux下差不多 ,我们看这个简单的示例 ,在jni目录下新建一个文件Android.mk :

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := helloAndroidNDKLOCAL_SRC_FILES := com_cumt_ndktest2_HelloAndroidNDK.cinclude $(BUILD_SHARED_LIBRARY)

先来解释一下makefile中这些参数的含义 :

LOCAL_PATH := $(call my-dir)     Android.mk 文件必须以这个开头,用来辨识源文件的路径 $(call my-dir) 表示当前路径下即和Android.mk 位于同一个目录下 ,
也就是说我们的源文件需要和Android.mk文件在同一文件夹下。

LOCAL_MODULE    := helloAndroidNDK    我们编译链接后生成的库的名称  ( 比如动态库最终是  libhelloAndroidNDK.so)

LOCAL_SRC_FILES := com_cumt_ndktest2_HelloAndroidNDK.c  源文件

include $(BUILD_SHARED_LIBRARY) 标识生成动态库 (也可以通过 BUILD_STATIC_LIBRARY生成静态库

使用cygwin编译链接生成动态库:

我们使用cygwin来在window下模拟一个linux环境进行动态库的生成操作。
我们将jni文件夹copy到下载后解压的ndk的根目录下 

然后在cygwin的终端界面进入到jni目录下,使用ndk-build指令 ,如下图所示 :



然后我们发现在ndk的根目录下生成了一个文件夹libs, 打开后是一个文件夹armeabi,在该文件夹下就生成了我们所需要的动态库——libhelloAndroidNDK.so 。
然后我们就可以在android项目中来使用这个so包了 。

注意事项 :

在cygwin中使用 ndk-build 失败,如果不是代码问题(或者提示make出错),可能是你的cygwin没有安装make工具 ,可以重新打开cygwin的安装包,然后在选择安装工具的界面
中输入make进行搜索然后进行安装。

关于makefile这里只是简要的说明了一下 。

参考:

主要参考资料 NDK的官方文档 ,官方文档中对于NDK工具的整个使用过程进行了详细介绍,在NDK的sample文件夹下
可以找到很多学习的代码 。



0 0
原创粉丝点击