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语 ...
随机推荐
- 工作总结汇报公司介绍产品宣传品牌展示企业文化PPT模
清晰明了:在工作总结会议上都是要严肃为主,搞的花里胡哨既不好看也让领导有不好的影响:微粒体:模板样式立体效果非常好,能够一把将观众眼球给吸引住:样式齐全:各种PPT样式都有,能够承载工作汇报各种内容: ...
- Thymeleaf常用语法:使用星号表达式
在处理模板时,一般情况都是使用变量表达式 ${...} 来显示变量,还可以使用选定对象表达式 *{...},它也称为星号表达式.如果在模板中先选定了对象,则需要使用星号表达式.Thymeleaf的内置 ...
- python创建文件夹
import os filePath = 'D:\12345' # 判断文件夹是否存在,不存在则创建文件夹if not os.path.exists(filePath): os.makedirs(fi ...
- 6个最优秀的微信小程序UI组件库
开发微信小程序的过程中,选择一款好用的组件库,可以达到事半功倍的效果.自从微信小程序面世以来,不断有一些开源组件库出来,下面6款就是排名比较靠前,用户使用量与关注度比较高的小程序UI组件库.还没用到它 ...
- Linux-3.14.12内存管理笔记【构建内存管理框架(5)】
前面已经分析了内存管理框架的构建实现过程,有部分内容未完全呈现出来,这里主要做个补充. 如下图,这是前面已经看到过的linux物理内存管理框架的层次关系. 现着重分析一下各个管理结构体的成员功能作用. ...
- Linux系统学习 五、网络基础—网络通信协议
OSI/ISO七层模型和TCP/IP四层模型 网络层协议和IP划分 OSI的七层框架 物理层:设备之间的比特流的传输.物理接口.电气特性等. 数据链路层:成帧.用MAC地址访问媒介.错误检测与修正. ...
- Java核心(一)深入理解BIO、NIO、AIO
目标: BIO.NIO.AIO 的区别是什么? 同/异步.阻/非阻塞的区别是什么? 文件读写最优雅的实现方式是什么? NIO 如何实现多路复用功能? 一,IO的介绍: (1)IO的全称其实是:Inpu ...
- 浅谈浏览器解析 URL+DNS 域名解析+TCP 三次握手与四次挥手+浏览器渲染页面
(1)浏览器解析 URL 为了能让我们的知识层面看起来更有深度,我们应该考虑下面两个问题了: 从浏览器输入 URL 到渲染成功的过程中,究竟发生了什么? 浏览器渲染过程中,发生了什么,是不是也有重绘与 ...
- prometheus监控tomcat
下载tomcat,wget **;解压tar zxvf **; 下载jmx_exporter, wget https://repo1.maven.org/maven2/io/prometheus/j ...
- 201871010116-祁英红《面向对象程序设计(java)》第十四周学习总结
博文正文开头格式:(2分) 项目 内容 <面向对象程序设计(java)> https://home.cnblogs.com/u/nwnu-daizh/ 这个作业的要求在哪里 https:/ ...