(一)JNI基本概念
1. 基本概念:
首先,注意:C和C++在调用JNI时候方法是不一样的
注意看下面两个的区别:
C++
#include <jni.h>
#include <string> extern "C"
JNIEXPORT jstring JNICALL
Java_android_1serialport_1api_sample_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
C:
#include <string.h>
#include <jni.h>
JNIEXPORT jobject JNICALL Java_android_1serialport_1api_SerialPort_open
(JNIEnv *env, jclass thiz, jstring path, jint baudrate, jint flags)
{ (*env)->ReleaseStringUTFChars(env, path, path_utf);
return mFileDescriptor;
}
区别:
C | C++ |
(*env)->xxx | env->xxx |
#include<string.h> | #include<string> |
基本数据类型: boolean/char/byte/short/int/long/double/float/
//引用数据类型则不能直接使用,需要根据JNI函数进行相应的转换后,才能使用
引用数据类型: object/class/string/byte[]/short[]/int[]/long[]/...
描述符(注意:除了基本类型,其他都有;冒号)
1. 类描述符 String:/java/lang/String;
2. 数组类型描述符
3.域描述符:其实就是属性或者数据描述符
1). 基本数据类型描述符 Z/B/C/S
2). 引用数据类型描述符 数组:[I/[F:一维数组 [[i:二维数组 [Ljava/lang/Object:String[]
3). 方法描述符:
String test(): ()Ljava/lang/String; (这里的;不可少)
void set(byte[] bytes): ([B)V (这里的;不可少)
int f(int i, Object object): (ILjava/lang/Object)I
C-->JAVA:
创建一个对象的方法
1. 加载类:(FindClass)
2. 找到该类的构造方法的id(GetMethodID(env,1中找到的类,"<init>","()V"))
3. 创建该类一个新的对象(NewObject(env, 1中找到的类, 2中找到的构造方法))
调用一个对象中的属性
1. 找到该对象的类(FindClass)
2. 找到类中的属性ID(GetFieldID(env, 1中的类, 属性名, 属性描述符))
3. 得到该属性(GetIntField(env, 对象, 2中的属性ID))
调用一个对象中的方法
1. 找到该对象的类(GetObjectClass(env, 这个对象))
2. 找到类中的方法ID
3. 设置该对象的方法
2. 数据类型
1. 基本类型:
2. 引用类型:
引用数据类型则不能直接使用,需要根据JNI函数进行相应的转换后,才能使用
3. 描述符
1. 类描述符
类描述符是类的完整名称(包名+类名),将原来的 . 分隔符换成 / 分隔符。
例如:在java代码中的java.lang.String类的类描述符就是java/lang/String
其实,在实践中,我发现可以直接用该类型的域描述符取代,也是可以成功的。
例如: jclass intArrCls = env->FindClass("java/lang/String")
等同于 jclass intArrCls = env->FindClass("Ljava/lang/String;")
2. 属性描述符
JNI函数分为:类操作、异常操作、全局或局部引用、对象操作、字符串操作、访问对象的属性和方法、注册本地方法。
4. 操作方法
创建一个对象的方法
1. 加载类:(FindClass)
2. 找到该类的构造方法的id(GetMethodID(env,1中找到的类,"<init>","()V"))
3. 创建该类一个新的对象(NewObject(env, 1中找到的类, 2中找到的构造方法))
调用一个对象中的属性
1. 找到该对象的类(FindClass)
2. 找到类中的属性ID(GetFieldID(env, 1中的类, 属性名, 属性描述符))
3. 得到该属性(GetIntField(env, 对象, 2中的属性ID))
调用一个对象中的方法
1. 找到该对象的类(GetObjectClass(env, 这个对象))
2. 找到类中的方法ID
3. 设置该对象的方法
参考资料:
http://blog.csdn.net/qinjuning/article/details/7595104/
http://blog.csdn.net/qinjuning/article/details/7599796
(一)JNI基本概念的更多相关文章
- Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序,使用C启动JAVA程序
Android For JNI(一)--JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序 当你的Android之旅一步步的深入的时候,你其实会发现,很多东西都必须去和framew ...
- JNI技术概念小结
JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? |- 首先,Java语言 ...
- JNI基础概念以及原理-2016.01.11
Java到C数据类型转换 1 基础类型 Java与Jni类型对应关系 2 String到char数组 具体使用方式 JNIEXPORT jstring JNICALL Java_com_zhoulee ...
- 【转】 Android的NDK开发(1)————Android JNI简介与调用流程
原文网址:http://blog.csdn.net/conowen/article/details/7521340 ****************************************** ...
- Android studio 下 JNI 开发实例
在AS中进行 NDK 开发之前,我们先来简单的介绍几个大家都容易搞懵的概念: 到底什么是JNI,什么是NDK? 何为“交叉编译”? 先看什么是 JNI?JNI 的全称就是 Java Native In ...
- Android的NDK开发(1)————Android JNI简介与调用流程
1.JNI简介 JNI全称为Java Native Interface(Java本地调用).从Java1.1开始,JNI成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C ...
- java 本地方法(JNI)
最近搞了一个调用第三方so库做登录认证的任务,以前对JNI没什么概念,最近学习了 <java核心技术> 本地方法 一章,把自己写的一些例子记录一下. 自己C语言真是渣渣,所以所有的例子都在 ...
- Kotlin Native
Kotlin Native 不是 Jni 的概念,它不仅仅是要与底层代码比如 C.C++ 交互,而且还要绕过 Jvm 直接编译成机器码供系统运行.也就是说,Kotlin 准备丢掉 Java 这根拐杖了 ...
- Android应用博客目录
应用有很多,开个博客都放进来方便查找,也方便修改 1 语言类: 1.1 JAVA 基础语言知识JAVA Collection与Collections,Array与Arrays的区别 JAVA练手--S ...
随机推荐
- 10-08常用的TIME和DATE函数以及各个函数对应的头文件
系统时间和日期函数: #include <time.h> char *asctime(const struct tm *tm);//将tm中存放的信息转换为标准格式 ...
- SparkSQL大数据实战:揭开Join的神秘面纱
本文来自 网易云社区 . Join操作是数据库和大数据计算中的高级特性,大多数场景都需要进行复杂的Join操作,本文从原理层面介绍了SparkSQL支持的常见Join算法及其适用场景. Join背景介 ...
- 流式处理框架storm浅析(下篇)
本文来自网易云社区 作者:汪建伟 举个栗子 1 实现的目标 设计一个系统,来实现对一个文本里面的单词出现的频率进行统计. 2 设计Topology结构: 这是一个简单的例子,topology也非常简单 ...
- 激活xmind的方法
https://blog.csdn.net/qq_38238041/article/details/81107127 这里以windows为例来演示,其它操作系统需根据情况修改相应步骤. 下载安装包 ...
- jquery中选择器的 html() text() val() attr() 方法的区别与使用方式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- python接口自动化发送get请求 详解(一)
前言:接口自动化实现自动化脚本比较稳定,主要用到requests模块,后面我会把这个模块单独拉出来写一下. 一.环境安装 1.用pip安装requests模块 >>pip install ...
- SAE实践——创建新应用开启MySQL服务
1. 创建SAE应用 当创建完成SAE账户之后,即可创建SAE应用.点击创建新应用按钮,创建一个新的SAE 应用 阅读提示信息,等待五秒,点继续创建. 填写应用信息完成创建.可选择PHP5.3和空应用 ...
- Python-Django编程问题汇总
OS:Windows10 64 IDE:JetBrain Python Community Edition 2017.3.4 Python:python-3.6.4 Django:V2.0.3 问题一 ...
- C#-MVC基础-模型(Model)、视图(View)和控制器(Controller)
搜狗百科:http://baike.sogou.com/v25227.htm?fromTitle=MVC MVC全名是Model View Controller,是软件工程中的一种软件架构模式,把软件 ...
- PCA简单实现
''' 总结一下PCA的算法步骤: 设有m条n维数据. 1)将原始数据按列组成n行m列矩阵X 2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值 3)求出协方差矩阵C=1/m*(XX ...