java ndk 在哪_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) // 要释放的局部数组对象
用于构建其他基本数据类型的数组
NewArray 方法族
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 GetField(JNIEnv *env, // JNI接口指针
jobject obj, // java 对象(不能null)
jfieldID fieldID);// 有效的域ID
设置java层类中属性的值
void SetField(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 GetStaticField(JNIEnv *env, // JNI接口指针
jobject obj, // java 对象(不能null)
jfieldID fieldID);// 有效的域ID
设置java层类中属性的值
void SetStaticField(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 CallMOthod(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 CallStaticMOthod(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框架。
java ndk 在哪_NDK简介相关推荐
- Java开源——常见J2EE框架简介
Java开源--常见J2EE框架简介 Spring Framework Spring是一个解决了许多在J2EE开发中常见的问题的强大框架. Spring提供了管理业务对象的一致方法并且鼓励了注入对接口 ...
- java的网络工具netty简介
2019独角兽企业重金招聘Python工程师标准>>> java的网络工具netty简介 Netty是一个NIO的客服端服务器框架,它可以简单.快速的搭建器一个协议包客服端服务器的应 ...
- Java核心类库篇1——简介
Java核心类库篇1--简介 1.核心类库 包名 主要功能 java.applet 提供了创建applet需要的所有类 java.awt.* 提供了创建用户界面以及绘制和管理图形.图像的类 java. ...
- java 轻量级同步volatile关键字简介与可见性有序性与synchronized区别 多线程中篇(十二)...
概念 JMM规范解决了线程安全的问题,主要三个方面:原子性.可见性.有序性,借助于synchronized关键字体现,可以有效地保障线程安全(前提是你正确运用) 之前说过,这三个特性并不一定需要全部同 ...
- Java OutputStream.write()的功能简介说明
转自: Java OutputStream.write()的功能简介说明 下文讲述java中OutputStream.write()方法的功能简介说明,如下所示: OutputStream.write ...
- Java字节码框架ASM简介
Java字节码框架ASM简介 1. ASM概述 1.1 ASM简介 1.2 ASM提供API 1.3 ASM核心模块 2. ASM应用 2.1 ASM依赖 2.2 代码实现 2.3 测试验证 1. A ...
- java中同步和异步简介及应用场景
转自: java中同步和异步简介及应用场景 同步: 同步指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系. 本意是指某人或某事同时进行:同时产生,比如音画同步.动作同步等. 同步,指对在一 ...
- java Apache Commons jar包简介
一.Commons BeanUtils 说明:针对Bean的一个工具集.由于Bean往往是有一堆get和set组成,所以BeanUtils也是在此基础上进行一些包装. 二.Commons CLI 说明 ...
- 【连载】Scala程序设计:Java虚拟机多核编程实战——简介
可以在JVM上编程的语言有很多.通过这本书,我希望让你相信花时间学习Scala是值得的. Scala语言为并发.表达性和可扩展性而设计.这门语言及其程序库可以让你专注于问题领域,而无需深陷于诸如线程和 ...
最新文章
- 两亿多用户,六大业务场景,知乎AI用户模型服务性能如何优化?
- 东芝打印机cd40故障_东芝小尺寸UV平板机介绍
- 设置dialog显示,自定义时间到后dialog消失
- 【Python-ML】非线性映射降维-KPCA方法
- 机器学习笔记——皮尔逊相关系数
- 程序环境——翻译环境与执行环境
- mysql 中文排序_mysql如何按照中文排序解决方案
- 攻击者滥用 Citrix NetScaler 设备 0day,发动DDoS放大攻击
- 使计算机进入休眠状态
- 60个有用CSS代码片段
- 学习计划大纲(大一)
- JavaScript - ES6之Promise(then方法详解)
- 手把手教你高效快捷的创建Swift Framework
- 沧小海读《图解TCP/IP》笔记——第四章 IP协议
- 紫光云服务器芯片,紫光云与新华三半导体共建芯片设计云2.0 携手打造一站式云端芯片平台...
- 2012最新网站手工注入详解教程
- openwrt控制天翼网关定时重启
- 华为2019春招留学生笔试第三题python
- 如何关闭电脑自动更新?方案三部曲带你走出自动更新的阴影
- 学AI买计算机,如何用免费GPU学习AI算法?这篇大集锦不要错过
热门文章
- (七)SpringBoot+SpringCloud —— 集成断路器
- 英利1500伏光伏组件系列亮相美国
- Android 布局学习之——Layout(布局)详解一
- JavaScriptWindow使用对象
- a与a:link、a:visited、a:hover、a:active
- 对自学还是培训的看法
- samba and AD
- 单目视觉标定:世界坐标系、相机坐标系、图像坐标系、像素坐标系——简单粗暴,粗暴
- Linux+CLion+cmake 动态链接库的使用
- 集成ffmpeg/x264:ERROR: libx264 not found的问题