一、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. 池化HttpClient,拿去就能用

    import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpEntity; import org.apache.http.HttpResp ...

  2. iOS 中UICollectionView实现各种视觉效果

    参考链接:https://www.jianshu.com/p/b3322f41e84c 基础:https://www.jianshu.com/p/d0b034f59020

  3. 射频IC卡和IC卡读卡器的成本分析

    当今射频IC卡和IC卡读卡器的种类繁多,很多人问IC卡读卡器多少钱,那么如何在满足我们需求的情况下最大的节省成本呢.下面就各种射频IC卡和IC卡读卡器来分析下各自的成本.                ...

  4. Erlang/Elixir精选Q&A

    精选的定位是什么? 已至2019年,Erlang/Elixir中文社区还是一座黑暗森林,每个技术人都怀揣着自己独有的葵花宝典独自摸索,没有一个开放的分享平台,大量优质文章没有得到该有的关注. 与此同时 ...

  5. 【论文阅读】Second-order Attention Network for Single Image Super-Resolution

    概要 近年来,深度卷积神经网络(CNNs)在单一图像超分辨率(SISR)中进行了广泛的探索,并获得了卓越的性能.但是,大多数现有的基于CNN的SISR方法主要聚焦于更宽或更深的体系结构设计上,而忽略了 ...

  6. go语言设计模式之template

    template.go package template import ( "strings" ) type MessageRetriever interface { Messag ...

  7. 一、itk在VS2019上面的安装 和例子(HelloWorld)运行

    一.Itk简介 vtk是专门用于医疗图像处理的函数库,类似opencv. 这篇博客主要是讲解安装vtk之后的例子的运行,即如何构建自己的第一个ITK例子 二.Itk安装 Itk安装参考这篇博客: ht ...

  8. IDEA中增加日志相关的Live Templates

    1.新增一个Template Group 来将一个类型的放一起 2.在Template Group增加Live Template 这里可以分为三步 第一步填写想要看到的代码,变量部分用$paramet ...

  9. 关于jvm的常识介绍

    1.关于jvm的组成(只介绍1.8,以前的版本不多介绍) vm stack,native method stack,program counter register,heap,metaspace 2. ...

  10. 如何解决android 通知栏不显示的问题

    android 8.0 以后的版本,在创建通知栏的时候,加了一个channelId的东西.要想在上述版本中显示通知,总共分两步 1.创建Channel if (Build.VERSION.SDK_IN ...