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基本概念的更多相关文章

  1. Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序,使用C启动JAVA程序

    Android For JNI(一)--JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序 当你的Android之旅一步步的深入的时候,你其实会发现,很多东西都必须去和framew ...

  2. JNI技术概念小结

    JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? |-  首先,Java语言 ...

  3. JNI基础概念以及原理-2016.01.11

    Java到C数据类型转换 1 基础类型 Java与Jni类型对应关系 2 String到char数组 具体使用方式 JNIEXPORT jstring JNICALL Java_com_zhoulee ...

  4. 【转】 Android的NDK开发(1)————Android JNI简介与调用流程

    原文网址:http://blog.csdn.net/conowen/article/details/7521340 ****************************************** ...

  5. Android studio 下 JNI 开发实例

    在AS中进行 NDK 开发之前,我们先来简单的介绍几个大家都容易搞懵的概念: 到底什么是JNI,什么是NDK? 何为“交叉编译”? 先看什么是 JNI?JNI 的全称就是 Java Native In ...

  6. Android的NDK开发(1)————Android JNI简介与调用流程

    1.JNI简介 JNI全称为Java Native Interface(Java本地调用).从Java1.1开始,JNI成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C ...

  7. java 本地方法(JNI)

    最近搞了一个调用第三方so库做登录认证的任务,以前对JNI没什么概念,最近学习了 <java核心技术> 本地方法 一章,把自己写的一些例子记录一下. 自己C语言真是渣渣,所以所有的例子都在 ...

  8. Kotlin Native

    Kotlin Native 不是 Jni 的概念,它不仅仅是要与底层代码比如 C.C++ 交互,而且还要绕过 Jvm 直接编译成机器码供系统运行.也就是说,Kotlin 准备丢掉 Java 这根拐杖了 ...

  9. Android应用博客目录

    应用有很多,开个博客都放进来方便查找,也方便修改 1 语言类: 1.1 JAVA 基础语言知识JAVA Collection与Collections,Array与Arrays的区别 JAVA练手--S ...

随机推荐

  1. 10-08常用的TIME和DATE函数以及各个函数对应的头文件

    系统时间和日期函数:     #include <time.h>     char *asctime(const struct tm *tm);//将tm中存放的信息转换为标准格式    ...

  2. SparkSQL大数据实战:揭开Join的神秘面纱

    本文来自 网易云社区 . Join操作是数据库和大数据计算中的高级特性,大多数场景都需要进行复杂的Join操作,本文从原理层面介绍了SparkSQL支持的常见Join算法及其适用场景. Join背景介 ...

  3. 流式处理框架storm浅析(下篇)

    本文来自网易云社区 作者:汪建伟 举个栗子 1 实现的目标 设计一个系统,来实现对一个文本里面的单词出现的频率进行统计. 2 设计Topology结构: 这是一个简单的例子,topology也非常简单 ...

  4. 激活xmind的方法

    https://blog.csdn.net/qq_38238041/article/details/81107127 这里以windows为例来演示,其它操作系统需根据情况修改相应步骤. 下载安装包 ...

  5. jquery中选择器的 html() text() val() attr() 方法的区别与使用方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. python接口自动化发送get请求 详解(一)

    前言:接口自动化实现自动化脚本比较稳定,主要用到requests模块,后面我会把这个模块单独拉出来写一下. 一.环境安装 1.用pip安装requests模块 >>pip install ...

  7. SAE实践——创建新应用开启MySQL服务

    1. 创建SAE应用 当创建完成SAE账户之后,即可创建SAE应用.点击创建新应用按钮,创建一个新的SAE 应用 阅读提示信息,等待五秒,点继续创建. 填写应用信息完成创建.可选择PHP5.3和空应用 ...

  8. Python-Django编程问题汇总

    OS:Windows10 64 IDE:JetBrain Python Community Edition 2017.3.4 Python:python-3.6.4 Django:V2.0.3 问题一 ...

  9. C#-MVC基础-模型(Model)、视图(View)和控制器(Controller)

    搜狗百科:http://baike.sogou.com/v25227.htm?fromTitle=MVC MVC全名是Model View Controller,是软件工程中的一种软件架构模式,把软件 ...

  10. PCA简单实现

    ''' 总结一下PCA的算法步骤: 设有m条n维数据. 1)将原始数据按列组成n行m列矩阵X 2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值 3)求出协方差矩阵C=1/m*(XX ...