Eclipse Android NDK入门


本文来自慕课网课程Android-NDK入门

1. 官网下载Android-NDK

ndk官网

版本:android-ndk-r9d

2. Android-NDK环境配置

path里面添加上android-ndk-r9d的目录,就可以在CMD中执行ndk-build来编译ndk项目了

eclipse里面安装ADT插件:
Help->Install New Software…->Add…->Archive…->选择自己下载的ADT->ok->select All(一定要选Android Development Tools)——>Next->Finish

3. Android-NDK导入例子

导入ndk项目android-ndk-r9d->samples->hello-jni,此时项目中没有.so文件;

ndk-build:对ndk项目进行编译,并生成.so文件

4. Android-NDK配置模拟器

Genymotion的安装与eclipse配置教程

下载genymotion arm translation兼容包,直接拖拽到打开的虚拟机中

编译速度慢的处理方法:
开发的时候只编译armeabi平台就可以了,方法:
1. jni->Application.mk文件中的APP_ABI := all注释掉
2. 在编译的时候执行ndk-build clean把生成的.so文件清除
3. 再执行ndk-build执行编译,这次只编译了armeabi平台的.so文件

5. 开发第一个ndk项目

  1. 在需要引用底层方法的地方写出要引用的native方法:public static native String getStringFromC();
  2. 在项目中创建jni文件夹
  3. 通过执行javah方法,通过java文件生成jni头文件,保存在jni文件夹里面:
javah -classpath bin/classes;F:\adt-bundle-windows-x86_64\adt-bundle-windows-x86_64-20140702\sdk\platforms\androi
d-16\android.jar -d jni com.example.hellondk.MainActivity

执行上面javah方法后生成了jni头文件,里面包含由java+包名+类名+方法名组成的方法签名(唯一标识),通过这个唯一标识就可以查找java层所调用的方法对应于native层的哪个方法。

  1. 实现native方法的.c文件
    把刚才生成的jni头文件用#include"*.h"引入到.c文件中,把jni头文件中的方法拷贝到.c文件中,在.c文件中实现该方法。

  2. 修改Android.mk文件
    LOCAL_MODULE:jni编译之后生成的.so文件叫什么名字
    LOCAL_SRC_FILES:要对哪个c文件进行编译’

  3. 对当前项目进行编译
    进入项目目录执行ndk-build编译命令,生成.so文件

  4. 项目中调用生成的.so文件
    项目中引入.so文件:

static{
    System.loadLibrary("hello");
}

hello:Android.mk中设置的LOCAL_MODULE即编译之后生成的.so文件名;

6. Android-mk相关概念介绍

什么是交叉编译?

简单说,就是在一个平台上生成另一个平台上可执行的代码。

jni是什么?

Java Native Interface(JNI)标准成为java平台的一部分,它允许java代码和其它语言写的代码进行交互。

jni的实现流程?

image

什么是链接库?
1. 静态链接库
所以赖的资源编译的时候都编译到同一个文件中
2. 动态链接库
在编译的时候只编译自己的代码,运行的时候会查找所依赖的资源
ndk编译的是动态链接库

make文件介绍:

ndk-build:查找当前android应用程序下的Androd.mk文件,根据Android.mk的配置对.c文件进行编译,生成动态链接库.so文件

ndk-stack.exe:调试代码是非常有用的命令,将log文件编译成可以定位到哪一行代码的文件,对快速查找bug非常有用

7. eclipse配置ndk环境和打印log信息

  1. eclipse关联android-ndk库:
    Window->Preferences->Android->NDK->NDK Location中关联android-ndk库
  2. eclipse中配置编译命令:
    进入:Project->Properties->Builders->New->Program
    2.1. 配置Location:android-ndk中ndk-build.cmd目录
    2.2. 配置Working Directory:选择当前项目
    2.3. 选择自动编译:Build Options->During auto builds
  3. 在ndk项目中打印log信息
    可以参考simples项目native-media进行配置:
    3.1 引入打印log的方法:
// for __android_log_print(ANDROID_LOG_INFO, "YourApp", "formatted message");
#include <android/log.h>
#define TAG "NativeMedia"
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)

打印log的方法__android_log_print在头文件android/log.h中声明,头文件android/log.h的位置在android-ndk的F:\NDK\android-ndk-r9d\platforms\android-16\arch-arm\usr\include\android\log.h中,这个log.h中包打印日志方法的声明。
3.2 在需要打印log是调用LOGV(...)方法
3.2 Android.mk文件的配置

# for logging
LOCAL_LDLIBS    += -llog

8. jni交互处理之字符串处理

java native文档

Primitive Types:native层类型与java层类型对比

java层和native层进行字符串的交互处理?
需要jni层做个中转
GetStringUTFChars:java层字符串转化成native层字符指针

ReleaseStringUTFChars:释放字符指针

9. jni交互处理之数组处理

数组处理:
1. 生成native层的数组拷贝
1.1. Get<PrimitiveType>ArrayRegion Routines:拷贝java层数组
1.2. Set<PrimitiveType>ArrayRegion Routines:将native层数组拷回java层
2. 直接调用java层数组指针进行操作
2.1. Get<PrimitiveType>ArrayElements Routines:native层拿到java层数组的指针
2.2. GetArrayLength:获取数组长度
2.3. Release<PrimitiveType>ArrayElements Routines:释放指针

native层类型以及方法都可以在jni.h头文件中查找到:
jni.h文件在android-ndk中:F:\NDK\android-ndk-r9d\platforms\android-16\arch-arm\usr\include\jni.h

10. JNI的交互处理之eclipse开发工具配置上

1. 配置生成javah选项

1.1. Run->External Tools->External Tools Configurations…->Program->右键New:
1.2. Name:javah
1.3. Loaction:Variable…->system_path->${system_path:javah}
1.4. Working Directory:Variables…->project_loc->${project_loc}\jni
1.5 Arguments:-classpath->Variables…->project_loc->\bin\classes;->拷贝android-sdk中的android.jar目录:F:\adt-bundle-windows-x86_64\adt-bundle-windows-x86_64-20140702\sdk\platforms\android-16\android.jar-> -d->Variable->project_loc->\jni -jni->Variables…->java_type_name->最终:-classpath${project_loc}\bin\classes;F:\adt-bundle-windows-x86_64\adt-bundle-windows-x86_64-20140702\sdk\platforms\android-16\android.jar -d ${project_loc}\jni -jni${java_type_name}->这个问题不用管:The selected resource does not resolve to a Java element
1.6 使用:项目根目录下新建jni文件夹->选中带native接口的那个类->运行按钮选择javah->点击javah->jni目录中生成了c语言的.h头文件

2. 配置eclipse添加native支持jni方法代码提示(对c++提示比较友好,对c提示支持不太友好)

2.1. 选中需要jni代码提示的项目->右键:Android Tools->Add Native Support…>Finish
2.2. 选中需要jni代码提示的项目->右键:Properties->C/C++ General->Paths and Symbols->Add…->File system…->选中android-ndk所在目录:F:\NDK\android-ndk-r9d\platforms\android-19\arch-arm\usr\include->OK->1. 当前系统多了一个Includes文件夹,这个文件夹里面是我们开发ndk所需要的library,引入我们系统当中就可以使用它的代码提示;2. jni目录下系统帮我们生成了.cpp和Android.mk文件

3. 配置生成javap选项,打印签名

3.1. 作用:可以通过类的签名来找到类内部的调用
3.2. 签名命令:Javap
3.3. 打印类MainActivity.java的签名
  1. 签名中不显示私有方法:在项目目录下执行命令
    javap -classpath bin\classes -s com.example.helloc.MainActivity
  2. 签名中显示私有方法:在项目目录下执行命令
    javap -classpath bin\classes -s -p com.example.helloc.MainActivity
3.4. eclipse中配置签名命令:

Run->External Tools->External Tools Configurations…->Program->右键New:
Name:javap
Location:Variables…->${system_path:javap}
Working Directory:${project_loc}
Arguments:-classpath ${project_loc}\bin\classes -s -p ${java_type_name}->Run

3.5. eclipse中签名命令的使用:

选中含有native接口的java类->运行按钮选中javap->点击javap->打印出了所有签名

11. 延伸阅读

11.1 AS2.2使用CMake的方式进行JNI / NDK开发入门教程
11.2 向您的项目添加 C 和 C++ 代码
11.3 Android NDK
11.4 jni参考文档

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值