一、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. JMeter压测“java.net.BindException: Address already in use: connect”解决方法

    之前在windows机上用JMeter压测,50并发下出现大量接口报“java.net.BindException: Address already in use: connect”错误. 从字面的意 ...

  2. win7系统防止中招勒索病毒

    echo @@ netsh advfirewall firewall add rule name= netsh advfirewall firewall add rule name= netsh ad ...

  3. java简单实现用语音读txt文档

    最近比较无聊,随便翻着博客,无意中看到了有的人用VBS读文本内容,也就是读几句中文,emmm,挺有趣的,实现也很简单,都不需要安装什么环境,直接新建txt文件,输入一些简单的vbs读文本的代码,然后将 ...

  4. IE11,用Forms身份验证保存不了Cookie

    在web.config中添加如下信息,即可. <authentication mode="Forms">      <forms cookieless=" ...

  5. sqlserver刷新视图

    sqlserver 用于刷新当前数据库所有视图的存储过程 create procedure dbo.proc_refreshview as begin ) declare cur_view curso ...

  6. 浅谈Django基础(HttpResponse、render、redirect)

    1. 使用之前先导入他们 from django.shortcuts import HttpResponse, render, redirect 2. HttpResponse: 它是作用是内部传入一 ...

  7. 【python爬虫】初识爬虫

    一.爬虫的定义 爬虫定义:程序或者脚本——自动的爬取万维网的数据的程序或者脚本. 二.爬虫可以解决的问题 1.解决冷启动问题. 2.搜索引擎的根基——通用爬虫. 3.帮助机器学习建立知识图谱. 4.制 ...

  8. 【LOJ6620】「THUPC 2019」不等式 / inequality(线段树)

    点此看题面 大致题意: 给你两个长度为\(n\)的数组\(a_i\)和\(b_i\),定义\(f_k(x)=\sum_{i=1}^k|a_ix+b_i|\),对于\(k=1\sim n\)的每个\(f ...

  9. golang数据结构之树的三种遍历方式

    tree.go package tree import ( "fmt" ) type TreeNode struct { ID int Val int Left *TreeNode ...

  10. DirectShow 进行视频预览和录制

    这一篇讲怎么采集摄像头图像并预览,以及录制视频到本地. 程序实现流程 这里通过使用 CaptureGraphBuilder 来简化 Graph 的创建流程. 具体流程如下: 初始化 COM 库 创建各 ...