一、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简介的更多相关文章

  1. android gradle NDK简介

    本章介绍在Android开发中,关于NDK,gradle相关的知识点. 1.NDK简介 (1)NDK是一系列工具的集合 NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将s ...

  2. JNI与NDK简介

    最近稍微了解一下JNI和NDK. 网上各种教程给人一种二者不分的感觉, 经过自己运行代码, 将两者的关系理了一下. 就目前了解,JNI应该是java自带的一种调用c和c++等语言(native cod ...

  3. NDK开发-简介&环境搭建(Eclipse,Android Studio)

    NDK简介 NDK(Native Development Kit)是一套工具集,允许你在Android应用中嵌入c或c++. 使用NDK的好处主要有以下4点: 安全:由于apk的java层代码很容易被 ...

  4. Android NDK开发初识

    神秘的Android NDK开发往往众多程序员感到兴奋,但又不知它为何物,由于近期开发应用时,为了是开发的.apk文件不被他人解读(反编译),查阅了很多资料,其中有提到使用NDK开发,怀着好奇的心理, ...

  5. Android之NDK开发(转)

    Android之NDK开发 一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第 ...

  6. Android JNI 和 NDK

    1.Android NDK 一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第 ...

  7. Android JNI简介

    JNI简介 JNI (Java Native Interface),Java的本地接口 JNI是Java众多开发技术中的一门,意在利用本地代码,为Java程序提供 更高效,更灵活的拓展.应用场景包括: ...

  8. Android之NDK开发

    转自:http://www.cnblogs.com/devinzhang/archive/2012/02/29/2373729.html 一.NDK产生的背景 Android平台从诞生起,就已经支持C ...

  9. ndk开发教程以及问题解决方案

    一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语 ...

随机推荐

  1. django中使用pandas Django-pandas

    在django中使用pandas操作django的ORM查询出来的QuerySet对象,可以使用插件django-pandas. 截止教程书写时间,django-pandas已发布到0.6.1. 依赖 ...

  2. Linux-打包压缩命令

    内容总结自<鸟哥的Linux私房菜>http://cn.linux.vbird.org/linux_basic/0240tarcompress.php 一.打包/压缩文件常见扩展名 *.g ...

  3. Shell变量概述

    目录 1. Shell变量概述 1.定义变量,变量名=变量值.不能出现"-横杠"命令 2.引用变量,$变量名 3.查看变量,set显示所有变量,包括自定义变量和环境变量 4.取消变 ...

  4. SpringBoot高版本修改为低版本时测试类报错解决

    有时在使用idea通过Spring Initailizr创建项目时,默认只能创建最近的版本的SpringBoot项目. 这是如果想要换成版本,就可以在项目创建好了之后,在pom文件中直接将版本修改过来 ...

  5. oracle体系结构简介

    oracle体系结构简介 一.物理存储结构    1.数据文件       存放数据库数据,以dbf为扩展名.将数据放在多个数据文件中,       再将数据文件分放在不同的硬盘中,可以提高存取速度. ...

  6. [Go] 使用protobuf进行序列化和反序列化

    先定义消息类型 orders.proto syntax = "proto2"; package message; message Orders { required int32 o ...

  7. 《Web Development with Go》实现一个简单的rest api

    设计模式完了之后,应该实现具体的应用了. 设计模式还得没事就要复习. web应用,学习的是网上的一本书. <Web Development with Go> package main im ...

  8. deepin安装nginx失败记录

    问题描述 在deepin系统中,apt install nginx 返回信息报错: nginx 依赖于 nginx-full (<< 1.10.3-1+deb9u2.1~) | nginx ...

  9. Java流程控制之选择语句

    选择语句 选择语句也称之为判断语句,主要有2种写法,一种是if语句,一种是switch语句.下面我们就详细的介绍一下这2种语句的用法. 判断语句if if语句第一种形式: if 格式: 执行流程 首先 ...

  10. Python学习记录:括号配对检测问题

    Python学习记录:括号配对检测问题 一.问题描述 在练习Python程序题的时候,我遇到了括号配对检测问题. 问题描述:提示用户输入一行字符串,其中可能包括小括号 (),请检查小括号是否配对正确, ...