Android NDK使用方法

Android NDK使用方法


2024年6月19日发(作者:)

Android NDK使用方法

目前Android NDK只能编译出动态库.so文件,并不是能生成.apk文件,所以要调用底层

的NDK程序 必须分两个部分单独编写。 本文档将按照开发人员编码顺序介绍如何使用

NDK。本文使用的NDK版本为1.6r1版本, 因为不想配置交叉编译环境 直接使用了linux

版本的NDK在linux机器上编译。

1. 首先让NDK环境正确配置完成 然后才可以添加自己的代码编译。下载Android 1.6r1

NDK、解压到某一目录 并将环境变量ANDROID_NDK_ROOT 设为你解压的NDK所在路

径 比如我现在的NDK放在/home/once下名字为android-ndk 那么就需要用

export ANDROID_NDK_ROOT=/home/once/android-ndk

这条命令来设置环境变量

2.运行

./build/

更新系统工具链依赖 这点没什么好讲的 如果第一步配置对了 那么这一步NDK会根据你

的配置生成对应的工具链

3. 建立你自己的工作目录在apps目录下

3.1比如我的工程会放在/home/once/android-ndk/apps/下面

3.2 然后拷贝一个例子工程里的到你的目录 并修改里面的参

数为你的工程对应的值

APP_PROJECT_PATH := $(call my-dir)/project

APP_MODULES := test decrypt //主要是这里要改成你工程的依赖关系

我这里有2个互相依赖的模块 就是一个库依赖于另一个库 我这里的是decrypt

依赖test库 一般2个库的情形比较常见 就是我们的ndk接口依赖一个标准c

语言被交叉编译出来的库 为了保持工具链一致 当然最好的方法就是把你自己

的c库源码放进来编译

4.新建一个文件夹名为project 这个文件夹将用来存放你的jni工程 以及java工程

Java工程用eclipse辅助完成即可 这里我们只讲JNI工程。我们创立一个jni文

件夹在project下 然后同样从例子工程的jni文件夹下面拷贝一个文件过来

将里面的参数改对 如下

LOCAL_MODULE := test //这个是你的库的名字

LOCAL_SRC_FILES := test.c test.h //这个是你用来生成库的源码文件

之所以会生成动态库是因为下面这句:

include $(BUILD_SHARED_LIBRARY)

- 1 -

如果你的工程还需要依赖其他的模块就需要指定如下参数:

LOCAL_SHARED_LIBRARIES :=

Libtest

这个libtest其实就是我们上面的module名字 所以上面的得写

好依赖关系 否则这个库编译的时候会找不到test库

还有就是如果你想在你的NDK的c代码中打印android log那么你得再依赖一个

系统库:

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib –llog

以上几个步骤全部做完了就可以进入第5点 编译一下你的ndk库看看有没错误的了

5.向上层目录 进入到ndk的根目录,运行make APP=hello-jni(你的项目名称 V=1打

印详细 -B强制重编) 比如我这里的工程为email 那么如果我要编译我的工程 我就用这

条命令 make APP=email 如果没有错误 那么基本上说明你的c代码初步编译无误。

6.用eclipse创建一个Android Project,这里不多做论述。完成这个工程之后 将整个工程

复制到$ANDROID_NDK_ROOT /apps/你的工程目录/project/下, 然后进入ndk的根目录运行

命令编译整个工程, 这个时候ndk会帮你把jni下面的代码编译成库放到你的java工程

下面对应的目录中去。这时候用eclipse导入这个android工程, 你会发现你的android

工程下的libs下面有了你需要平台命名的文件夹里面包含你需要的库。这时候可以直接用

eclipse编译并生成apk文件 安装到机器或者模拟器调试无误整个工程就初步完成了。

以上讲的都是简单的工程构建步骤 在写NDK的时候还是有很多东西要注意的。NDK相比较

JNI方式确实简化了很多步骤 但是简化的步骤NDK帮你自动生成就需要你严格按照规则来

做。比如你的NDK里面的函数名 你必需严格的按照Java_com。。。 这样的名字命名 com

以及后面就是你的调用ndk的java类文件名最后一个短横线之后的为你的native函数名。

如果这里写的不正确 或者参数不正确整个库的引导就会报异常。

TextView tv = new TextView(this);

t( stringFromJNI() ); //如果调用失败会抛出

sfiedLinkError异常

setContentView(tv);

} //注意下面的native关键字

public native String stringFromJNI();

public native String unimplementedStringFromJNI();

static {

brary("hello-jni"); //导入hello-jni库 }

- 2 -


发布者:admin,转转请注明出处:http://www.yc00.com/news/1718745989a2752318.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信