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语 ...
随机推荐
- Selenium(五):CSS选择器(二)
1. CSS选择器 1.1 选择语法联合使用 CSS selector的另一个强大之处在于:选择语法可以联合使用. html代码: <div id='bottom'> <div cl ...
- Java每日一面(Part1:计算机网络)[19/10/13]
作者:晨钟暮鼓c个人微信公众号:程序猿的月光宝盒 1.说说TCP三次握手 1.0 在此之前,什么是TCP? TCP(传输控制协议) 1.面向连接的,可靠的,基于字节流的传输层通信协议 2. ...
- Oracle数据库之第一篇
1 : Oracle 简介 : 是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器IP,端口,用户名.密码,点击:连接 (CLIENT/SERVER) ...
- HTML 文件路径
文件路径描述了网站文件夹结构中某个文件的位置. 文件路径会在链接外部文件时被用到: 网页 图像 样式表 JavaScript 绝对文件路径 绝对文件路径是指向一个因特网文件的完整 URL: 实例 &l ...
- Command CompileSwiftSources failed with a nonzero exit code
Xcode错误提示:Command CompileSwiftSources failed with a nonzero exit code,网上找了好多才搞定,通过在Build Setting里面自添 ...
- 一文解读HTTP2 (转)
作为一个经常和web打交道的程序员,了解这些协议是必须的,本文就向大家介绍一下这些协议的区别和基本概念,文中可能不局限于前端知识,还包括一些运维,协议方面的知识,希望能给读者带来一些收获,如有不对之处 ...
- 036.[转] JNDI 学习
使用外置服务器(如tomcat)时,如果一个服务器启动多个项目,可以使用JNDI配置数据源,这样每个项目都可以获取到Tomcat 配置的 JNDI的数据源. 在学习 jsp 的时候,作用域对象 pag ...
- 20个常用的JavaScript字符串方法
摘要: 玩转JS字符串. 原文:JS 前20个常用字符串方法及使用方式 译者:前端小智 Fundebug经授权转载,版权归原作者所有. 本文主要介绍一些最常用的JS字符串函数. 1. charAt(x ...
- Error 942 occured during Initialization of Bufq KUPC$S_1_20181023155636
一台ORACLE实例(Oracle Database 10g Release 10.2.0.5.0)启动时,报"Error 942 occured during Initializati ...
- alluxio 安装记录及相关信息
最近要尝试探究一下alluxio相关的知识,本博客进行对alluxio的安装过程进行备忘: 单例安装过程: https://docs.alluxio.io/os/user/stable/cn/cont ...