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框架。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265485.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARM汇编基础详解(PS学习汇编的原因)

目录前言1.GNU 汇编语法2.Cortex-A7 常用汇编指令2.1 处理器内部数据传输指令&#xff08;内部寄存器数据非内存数据&#xff09;2.2 存储器访问指令&#xff08;RAM&#xff09;2.3 压栈和出栈指令&#xff08;了解&#xff09;2.4 跳转指令2.5 算术运算指令2.6 逻辑运算指令前…

java formatter()_Java Formatter locale()用法及代码示例

locale()方法是java.util.Formatter的内置方法&#xff0c;该方法返回语言环境。此区域设置由格式化程序构造设置。具有语言环境参数的该对象的format方法不会更改此值。用法&#xff1a;public Locale locale()参数&#xff1a;该函数不接受任何参数。返回值&#xff1a;如果未…

linux中tree命令

需要安装tree包(安装&#xff1a;yum -y install tree)。 tree命令的选项说明如下&#xff1a; 【 匹配选项&#xff1a;】 -L&#xff1a;用于指定递归显示的深度&#xff0c;指定的深度必须是大于0的整数。 -P&#xff1a;用于显示统配符匹配模式的目录和文件&#xff0c;但是…

查看LINUX进程内存占用情况

可以直接使用top命令后&#xff0c;查看%MEM的内容。可以选择按进程查看或者按用户查看&#xff0c;如想查看oracle用户的进程内存使用情况的话可以使用如下的命令&#xff1a; (1)top top命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况…

ARM(IMX6U)裸机汇编LED驱动实验——驱动编写、编译链接起始地址、烧写bin文件到SD卡中并运行

参考&#xff1a;Linux之ARM&#xff08;IMX6U&#xff09;裸机汇编LED驱动实验–驱动编写 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-08-07 09:13:48 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/107851318 参考&#xff1a;Linux之…

Tools: geos 使用指南

1. 下载geos 2. 进入VS开发人员命令提示3、依次执行如下命令 >VCVARS32.BAT>cd D:\DevTool\geos-3.7.0>atuogen.bat>nmake /f makefile.vc> 编译成功后&#xff0c;会在D:\DevTool\geos-3.7.0\src目录下生成geos.lib, geos_i.lib, geos_c_i.lib, geos.dll, geos…

java 面试 概率论_编程培训-115个Java面试题和答案B.pdf

编程培训-115个Java面试题和答案B.pdf “玩转”Java系列 1 题目115个Java面试题和答案终极(下) 第一篇讨论了面向对象编程和它的特点&#xff0c;关于Java和它的功能的常见问题&#xff0c;Java的集合类&#xff0c; 垃圾收集器&#xff0c;本章主要讨论异常处理&#xff0c;Ja…

An Introduction to Our Code Breaking Team

小朋友们大家好&#xff0c;知道我们是谁吗&#xff1f;对了&#xff0c;我们就是Team Code Breaking&#xff01; 关于这个队名&#xff0c;我们讨论了很久&#xff0c;这个Code Breaking似乎是来源于某部电影&#xff0c;又似乎是来源于某本小说&#xff0c;或许单纯地只是觉…

ARM(IMX6U)裸机之I.MX6ULL硬件启动方式的选择

参考&#xff1a;Linux之ARM&#xff08;IMX6U&#xff09;裸机之I.MX6ULL启动方式详解 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-08-09 16:32:07 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/107891591 目录启动方式的选择①.串行下…

python 操作mongo

1.  导包&#xff1a; import pymongo 2.  建立连接 client pymongo.MongoClient("127.0.0.1",27017) 3.  获取数据库 db client["test1"] 4.  获取集合 col db["t2"] 5.  插入数据&#xff1a; col.insert_one({ name:aa , age:2 …

java 混码_kotlin java 混合代码 maven 打包实现

kotlin简介kotlin是一种针对java 平台的新编程语言。kotlin简洁、安全、务实&#xff0c;并且专注于与java代码的互操作性。它几乎可以用在现在java使用的任何地方&#xff1a;服务端开发、android应用等等。kotlin 可以很好地和所有现存的java库和框架一起工作&#xff0c;而且…

w3 protocol

http://www.w3.org/Protocols/HTTP/HTRQ_Headers.html http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

ARM(IMX6U)裸机之I.MX6ULL启动头文件详解(内部BOOT ROM、IVT + Boot data + DCD + led.bin)

参考&#xff1a;Linux之ARM&#xff08;IMX6U&#xff09;裸机之I.MX6ULL镜像烧写以及启动头文件的详解 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-08-09 17:10:00 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/107895975 目录BOOT R…

oracle日期函数

ORACLE日期函数大全&#xff01;2009-03-12 14:16:10日期函数 Oracle PL/SQL Oracle的日期函数相信很多人都有过统计某些数据的经历&#xff0c;比如&#xff0c;要统计财务的情况&#xff0c;可能要按每年&#xff0c;每季度&#xff0c;每月&#xff0c;甚至每个星期来分别统…

(转)git遇到的问题之“Please make sure you have the correct access rights and the repository exists.”...

对于git的提交一直很小心翼翼&#xff0c;感觉一不小心就会踩到莫名的坑。 这不&#xff0c; 某天commit 就遇到了On branch master nothing to commit (working directory clean) 一查意思。你的分支很干净&#xff1f; 干净&#xff1f;excuse me&#xff1f; 然后git push …

php 数组降维,php 数组去重的方法参考(一维数组去重、二维数组去重)

本文介绍下&#xff0c;对php数组去除重复的方法&#xff0c;包括一维数组的去重、二维数组的去重。有需要的朋友参考下。首先&#xff0c;来看一维数组重复项的去除方法。使用array_unique函数&#xff0c;例如&#xff1a;输出结果&#xff1a;Array ( [0] > apple [1] &g…

ARM(IMX6U)裸机C语言版本LED驱动实验(汇编进入处理器SVC模式、SP堆内存、跳转main函数、链接起始地址)

参考&#xff1a;Linux之ARM&#xff08;IMX6U&#xff09;裸机C语言LED驱动实验–驱动编写,编译 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-08-11 11:20:17 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/107930284 目录0.简介①、汇编…

IBM TS3200 Drive故障处理方案

一、故障定位1.1.故障信息截图摘要1.2.故障定位通过网线连接带库&#xff0c;进入Web管理模式从右边告警得到信息&#xff1a;Drive Broken Code :F3 02 SCD:5 ; Exception F3 52 –Error 经第二张图片定位&#xff0c;确认Drive 2故障需要更换一块Drive 模块此部件支持热插拔&…

常用模块-01

本节主要内容: 1. 模块的简单认识 2. collections模块 3. time时间模块 4. random模块 5. os模块 6. sys模块 一. 模块的简单认识 什么是模块. 模块就是我们把装有特定功能的代码进行归类的结果. 从代码编写的单位 来看我们的程序, 从小到大的顺序: 一条代码 < 语句块 < …

php7性能原理,php7卓越性能背后的原理有哪些?

喷答主 朱涵俊 说php没法常驻内存的人&#xff0c;是没理解答主的意思&#xff0c;看不下去了我要出来解释一波。本来想发评论下面的结果字数限制。。匿了-------------------技术分割线------------------99%的网站都会用到mvc架构&#xff0c;那php的框架是怎么工作的呢&…