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 ...
- SSH框架之Hibernate第三篇
1.1 多表关系分析和创建. 1.1.1 表关系分析和创建 表数据和表数据之间可以存在的关系? 一对多的关系 客户和联系人 建立关系原则: 在多的一方创建一个字段,这个字段作为外键指向一的一方的主键 ...
- SpringCloud(七):springcloud-config统一管理配置中心
前言: Spring Cloud Config组件是独立的,不需要注册到eureka.config工作原理是把读取目标到配置拉取到本地缓存一份然后供给其他客户端使用,所以一旦config启动成功,可以 ...
- iOS swift 带有attributeString的多行文本label
class AttributeStringGenerator { var attributeString: NSMutableAttributedString! var lineSpacing: CG ...
- SQL注入:DNS注入
DNS注入原理: 通过我们构造的数据,访问搭建好的DNS服务器,查看DNS访问的日志即可获取我们想要得到的数据. DNS注入使用场景: 在某些无法直接利用漏洞获得回显的情况下,但是目标可以发起请求,这 ...
- linux系统编程(一)概述
glibc库封装了linux系统调用,并提供c语言接口 所以学习linux系统编程,主要参考glibc库系统调用相关api 一.进程控制: fork 创建一个新进程 clone 按指定条件创建子进程 ...
- npm --save-dev 和 --save 的区别
转载 >>> 1. npm install 在安装 npm 包时,有两种命令参数可以把它们的信息写入 package.json 文件, 一个是npm install--save ...
- 机器学习--支持向量机 (SVM)算法的原理及优缺点
一.支持向量机 (SVM)算法的原理 支持向量机(Support Vector Machine,常简称为SVM)是一种监督式学习的方法,可广泛地应用于统计分类以及回归分析.它是将向量映射到一个更高维的 ...
- python3解决url编码与解码
对于url编码的转换,主要用urllib.parse包中的quote和unquote方法. quote进行解码,unquote进行编码. 代码实例: import urllib.parse u = & ...
- linux 头文件路径
linux 头文件路径 /usr/include