NDK简介
一、NDK简介:
C/C++的动态库。Dalvik通过JNI编程方式调用C/C++代码。
NDK编程提高软件性能,加密保护APK文件
ndk-build NDK编译生成脚本
Java编译时会根据java声明文件生成dex文件,即使没有java代码
NDK共享库:NDK生成的 .so文件(类似dll)
NDK静态库:.a文件件
二、JNI中的数据类型:
数据分两大类:基本类型,引用类型
基本类型
|
Java类型 |
JNI类型 |
C/C++类型 |
大小 |
|
boolean |
jboolean |
unsigned char |
无符号8位 |
|
byte |
jbyte |
char |
有符号8位 |
|
char |
jchar |
unsigned short |
无符号16位 |
|
short |
jshort |
short |
有符号16位 |
|
int |
jint |
Int |
有符号32位 |
|
long |
jlong |
long long |
有符号64位 |
|
float |
jfloat |
float |
32位浮点数 |
|
double |
jdouble |
double |
64位浮点数 |
引用类型
|
Java类型 |
原生类型 |
描述 |
|
java.lang.Class |
jclass |
类类型 |
|
java.lang.Throwable |
jthrowable |
异常类型 |
|
java.lang.String |
jstring |
字符类型 |
|
java.lang.Object[] |
jobjectArray |
任意java对象数组 |
|
boolean[] |
jbooleanArray |
布尔型数组 |
|
byte[] |
jbyteArray |
比特型数组 |
|
char[] |
jcharArray |
字符型数组 |
|
short[] |
jshortArray |
短整型数组 |
|
int[] |
jintArray |
整型数组 |
|
long[] |
jlongArray |
长整型数组 |
|
float[] |
jfloatArray |
浮点型数组 |
|
double[] |
jdoubleArray |
双浮点型数组 |
三、JNI中对Java类、域、方法的描述符
1。域描述:基本类型,引用类型,数组类型
基本类型描述符
|
域描述符 |
Java语言类型 |
|
Z |
boolean |
|
B |
byte |
|
C |
char |
|
S |
short |
|
I |
int |
|
J |
long |
|
F |
Float |
|
D |
double |
引用描述符:L+类描述+;
Eg:String Ljava/lang/String;
Object[] [Ljava/lang/object;
数组域的描述符
Eg:int[] [I
float[] [F
String[] [Ljava/lang/String;
int[][] [[I
2。类描述符:类的完整名(包名+类名)“.”替换成“/”
Eg:java.lang.String :java/lang/String
3。方法描述符:
规则:参数的域描述符按照声明顺序放入一个括号中,后跟返回值类型的域描述符。没有返回值用V(void)表示,如果是类引用后面加“;”
Eg:String text() ()Ljava/lang/String;
int fun(int i,Object object) (ILjava/lang/Object;)I
void set(byte[] bytes) ([B)V
Native中字符串的转换
1。C-〉Java
jstring NewStringUTF(JNIEnv *env, // JNI接口指针
const char* bytes)// C字符串
Eg:jstring jstring1 = env->NewStringUTF(“Hello Wrold”);
2。Java-〉C
char* GetStringUTFChars(JNIEnv *env, // JNI接口指针
jstring string, // jstring java字符串
jboolean* isCopy) // 表示返回副本还是堆中固定值
Eg:jboolean iscopy;
char* ch = env->GetStringUTFChars(jstring1,&iscopy);
Native中创建数组
1。创建一维数组
// 创建
jintArray NewIntArray(JNIEnv *env, // JNI接口指针
jsize length);// 数组长度
// 赋值数组某一范围
void SetIntArrayRegion(JNIEnv *env, //JNI接口指针
jintArray array, //目的数组
jsize start, //基本类型数组开始的位置
jsize len, //数组长度
const jint* buf); //源数组
// 获取数组值
void GetIntArrayRegion(JNIEnv *env, //JNI接口指针
jintArray array, //目的数组
jsize start, //基本类型数组开始的位置
jsize len, //数组长度
const jint* buf); //源数组
// 释放局部数组对象
void DeleteLocalRef(JNIEnv *env, // JNI接口指针
jobject localRef) // 要释放的局部数组对象
用于构建其他基本数据类型的数组
New<PrimitiveType>Array 方法族
Set< PrimitiveType >ArrayRegion
Get< PrimitiveType >ArrayRegion
2。创建数组对象
// 创建
jobjectArray NewIntArray(JNIEnv *env, // JNI接口指针
length,// 数组长度
jcalss elementClass,// 类型
jobject initialElement)// 初始值
// 设置
void SetobjectArrayElement(JNIEnv *env, //JNI接口指针
jobjectArray array, //目的数组
jsize index, //目的数组的第几个索引
jobject value) //写入的值
Native中java操作java类中的属性
1。Java层非静态
获取java层中属性ID
jfieldID GetFieldID(JNIEnv *env, // JNI接口指针
jclass class, // Java类对象
const char *name,// 该属性的name名称
const char *sig): // 属性的域签名
获取Java层中属性值
NativeType Get<type>Field(JNIEnv *env, // JNI接口指针
jobject obj, // java 对象(不能null)
jfieldID fieldID);// 有效的域ID
设置java层类中属性的值
void Set<type>Field(JNIEnv *env, // JNI接口指针
jobject obj, // java 对象(不能null)
jfieldID fieldID,// 有效的域ID
NativeType value);// 设置新值
2。Java层静态
获取java层中属性ID
jfieldID GetStaticFieldID(JNIEnv *env, // JNI接口指针
jclass class, // Java类对象
const char *name,// 该属性的name名称
const char *sig): // 属性的域签名
获取Java层中属性值
NativeType GetStatic<type>Field(JNIEnv *env, // JNI接口指针
jobject obj, // java 对象(不能null)
jfieldID fieldID);// 有效的域ID
设置java层类中属性的值
void SetStatic<type>Field(JNIEnv *env, // JNI接口指针
jobject obj, // java 对象(不能null)
jfieldID fieldID,// 有效的域ID
NativeType value);// 设置新值
Native中操作Java层类或接口的方法
1。Java层静态方法:
获取java层中属性ID
jmethodID GetMethodID(JNIEnv *env, // JNI接口指针
jclass class, // Java类对象
const char *name,// 该属性的name名称
const char *sig): // 属性的域签名
获取Java层中属性值
NativeType Call<type>MOthod(JNIEnv *env, // JNI接口指针
jobject obj, // java 对象(不能null)
jmethodID jmethodID,// 方法ID
...);// 要调用方法的参数
2。Java层静态方法操作
获取java层中属性ID
jmethodID GetStaticMethodID(JNIEnv *env, // JNI接口指针
jclass class, // Java类对象
const char *name,// 该属性的name名称
const char *sig): // 属性的域签名
获取Java层中属性值
NativeType CallStatic<type>MOthod(JNIEnv *env, // JNI接口指针
jobject obj, // java 对象(不能null)
jmethodID jmethodID,// 方法ID
...);// 要调用方法的参数
动态注册Native方法
1。在Java层声明要导出的函数
public native String getNatvieString();
2。在native中编写普通方法
3。定义数组在该数组中将Java中声明方法和native中定义的方法进行邦定
4。在JNI初始化函数JNI_OnLoad中注册函数
jint JNI_OnLoad(JavaVM *vm,void* reserved)
{
// 1。获取env对象
GetEnv或者AttachCurrentThread
// 2。获取class
FindClass
// 3。注册
RegisterNatives()
// 4。返回jni版本
return JNI_VERSION_xx;
}
NDK调试器两款:
1。GDB:UNIX/LINUX下基于命令行的调试工具
2。LLDB:基于LLVM框架。
NDK简介的更多相关文章
- android gradle NDK简介
本章介绍在Android开发中,关于NDK,gradle相关的知识点. 1.NDK简介 (1)NDK是一系列工具的集合 NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将s ...
- JNI与NDK简介
最近稍微了解一下JNI和NDK. 网上各种教程给人一种二者不分的感觉, 经过自己运行代码, 将两者的关系理了一下. 就目前了解,JNI应该是java自带的一种调用c和c++等语言(native cod ...
- NDK开发-简介&环境搭建(Eclipse,Android Studio)
NDK简介 NDK(Native Development Kit)是一套工具集,允许你在Android应用中嵌入c或c++. 使用NDK的好处主要有以下4点: 安全:由于apk的java层代码很容易被 ...
- Android NDK开发初识
神秘的Android NDK开发往往众多程序员感到兴奋,但又不知它为何物,由于近期开发应用时,为了是开发的.apk文件不被他人解读(反编译),查阅了很多资料,其中有提到使用NDK开发,怀着好奇的心理, ...
- Android之NDK开发(转)
Android之NDK开发 一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第 ...
- Android JNI 和 NDK
1.Android NDK 一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第 ...
- Android JNI简介
JNI简介 JNI (Java Native Interface),Java的本地接口 JNI是Java众多开发技术中的一门,意在利用本地代码,为Java程序提供 更高效,更灵活的拓展.应用场景包括: ...
- Android之NDK开发
转自:http://www.cnblogs.com/devinzhang/archive/2012/02/29/2373729.html 一.NDK产生的背景 Android平台从诞生起,就已经支持C ...
- ndk开发教程以及问题解决方案
一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语 ...
随机推荐
- PlayJava Day015
今日所学: /* 2019.08.19开始学习,此为补档. */ StringBuffer 定义: 可变字符序列 - 线程安全的 作用:基本与String相同,也是用于描述字符串 与String的区别 ...
- ubuntu安装gcc不同的版本
服务器ubuntu14.04安装ns3.29中,显示gcc版本过低 使用apt-get安装失败,ubuntu14.04默认安装gcc4.8.4,无法下载更高级的gcc版本 先找到资料1,脚本尝试了,下 ...
- cmdb项目-1
1.什么是cmdb 配置管理数据库 ,存储基础设备的各种信息配置等 CMDB可以存储并自动发现整个IT网络上的各种信息,比如一个IT网络上有多少台服务器.多少存储.设备的品牌.资产编号.维护人员.所属 ...
- JS简单数据类型
JS数据类型 在计算机中,不同的数据所需要占用的空间是不同的,为了便于把数据分析称所需内存大小不同的数据,充分利用存储空间,于是定义了不同的数据类型 简单数据类型 简单数据类型 说明 默认值 Numb ...
- iOS---------开发中 weak和assign的区别
weak和assign的区别-正确使用weak.assign 一.区别 1.修饰变量类型的区别weak只可以修饰对象.如果修饰基本数据类型,编译器会报错-“Property with ‘weak’ a ...
- Nginx web基础入门
目录 Nginx web基础入门 如何升级nginx或者添加功能 使用systemd管理nginx nginx相关配置文件 nginx的配置文件详解 日志格式 game日志记录实战 日志切割 手写虚拟 ...
- 模拟超市付款 (if 多分支结构)
""" 模拟超市付款: 商品单价 商品数量 键盘上输入商品单价,以及商品数量, 然后计算应付总额 计算总额 float 提示用户可以有4种付款方式 不同的付款方式有不同的 ...
- 数据结构笔记1(c++)_指针
一.数据结构概述 1.定义: 我们如何把现实中大量而复杂的问题,以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排 ...
- CentOS7 忘记Root密码解决方法
1- 在启动grub菜单,选择编辑选项启动 2 - 按键盘e键,来进入编辑界面 3 - 找到Linux 16的那一行,将ro改为rw init=/sysroot/bin/sh 4 - 现在 ...
- 面向对象OPP
在此之前学习的编程方式均称为面向过程,过程类似于函数,只能执行,没有返回值 面向过程和面向对象 面向过程-->怎么做? 面向对象-->谁来做? 相比函数,面向对象 是更大的封装,根据职 ...