一、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简介相关推荐

  1. Java开源——常见J2EE框架简介

    Java开源--常见J2EE框架简介 Spring Framework Spring是一个解决了许多在J2EE开发中常见的问题的强大框架. Spring提供了管理业务对象的一致方法并且鼓励了注入对接口 ...

  2. java的网络工具netty简介

    2019独角兽企业重金招聘Python工程师标准>>> java的网络工具netty简介 Netty是一个NIO的客服端服务器框架,它可以简单.快速的搭建器一个协议包客服端服务器的应 ...

  3. Java核心类库篇1——简介

    Java核心类库篇1--简介 1.核心类库 包名 主要功能 java.applet 提供了创建applet需要的所有类 java.awt.* 提供了创建用户界面以及绘制和管理图形.图像的类 java. ...

  4. java 轻量级同步volatile关键字简介与可见性有序性与synchronized区别 多线程中篇(十二)...

    概念 JMM规范解决了线程安全的问题,主要三个方面:原子性.可见性.有序性,借助于synchronized关键字体现,可以有效地保障线程安全(前提是你正确运用) 之前说过,这三个特性并不一定需要全部同 ...

  5. Java OutputStream.write()的功能简介说明

    转自: Java OutputStream.write()的功能简介说明 下文讲述java中OutputStream.write()方法的功能简介说明,如下所示: OutputStream.write ...

  6. 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 ...

  7. java中同步和异步简介及应用场景

    转自: java中同步和异步简介及应用场景 同步: 同步指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系. 本意是指某人或某事同时进行:同时产生,比如音画同步.动作同步等. 同步,指对在一 ...

  8. java Apache Commons jar包简介

    一.Commons BeanUtils 说明:针对Bean的一个工具集.由于Bean往往是有一堆get和set组成,所以BeanUtils也是在此基础上进行一些包装. 二.Commons CLI 说明 ...

  9. 【连载】Scala程序设计:Java虚拟机多核编程实战——简介

    可以在JVM上编程的语言有很多.通过这本书,我希望让你相信花时间学习Scala是值得的. Scala语言为并发.表达性和可扩展性而设计.这门语言及其程序库可以让你专注于问题领域,而无需深陷于诸如线程和 ...

最新文章

  1. 两亿多用户,六大业务场景,知乎AI用户模型服务性能如何优化?
  2. 东芝打印机cd40故障_东芝小尺寸UV平板机介绍
  3. 设置dialog显示,自定义时间到后dialog消失
  4. 【Python-ML】非线性映射降维-KPCA方法
  5. 机器学习笔记——皮尔逊相关系数
  6. 程序环境——翻译环境与执行环境
  7. mysql 中文排序_mysql如何按照中文排序解决方案
  8. 攻击者滥用 Citrix NetScaler 设备 0day,发动DDoS放大攻击
  9. 使计算机进入休眠状态
  10. 60个有用CSS代码片段
  11. 学习计划大纲(大一)
  12. JavaScript - ES6之Promise(then方法详解)
  13. 手把手教你高效快捷的创建Swift Framework
  14. 沧小海读《图解TCP/IP》笔记——第四章 IP协议
  15. 紫光云服务器芯片,紫光云与新华三半导体共建芯片设计云2.0 携手打造一站式云端芯片平台...
  16. 2012最新网站手工注入详解教程
  17. openwrt控制天翼网关定时重启
  18. 华为2019春招留学生笔试第三题python
  19. 如何关闭电脑自动更新?方案三部曲带你走出自动更新的阴影
  20. 学AI买计算机,如何用免费GPU学习AI算法?这篇大集锦不要错过

热门文章

  1. (七)SpringBoot+SpringCloud —— 集成断路器
  2. 英利1500伏光伏组件系列亮相美国
  3. Android 布局学习之——Layout(布局)详解一
  4. JavaScriptWindow使用对象
  5. a与a:link、a:visited、a:hover、a:active
  6. 对自学还是培训的看法
  7. samba and AD
  8. 单目视觉标定:世界坐标系、相机坐标系、图像坐标系、像素坐标系——简单粗暴,粗暴
  9. Linux+CLion+cmake 动态链接库的使用
  10. 集成ffmpeg/x264:ERROR: libx264 not found的问题