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. C# 转换为int类型时原本的正数变为负数

    转载http://bkcoding.cn/post_1215.html 平时定义变量用的int( int32 ),其取值范围为-2,147,483,648~2,147,483,647 当需要转换为in ...

  2. DataGridView添加一行数据、全选、取消全选、清空数据、删除选中行

    .net 2005下的Windows Form Application,一个DataGridView控件和4个Button,界面设置如下:         代码如下,有注解,相信大家都看得明白:   ...

  3. Java多线程编程:Callable、Future和FutureTask浅析(多线程编程之四)

    java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一)java多线程同步以及线程间通信详解&消费者生产者模式&死锁& ...

  4. 如何建立git 远程仓库

    第1步:创建SSH Key.在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步.如果没有,打开Shell ...

  5. 【12c OCP】最新CUUG OCP-071考试题库(52题)

    52.(12-11) choose the best answer: Examine the structure and data in the PRICE_LIST table: You plan ...

  6. 实时监测input输入变化 jQuery

    $('#production_name').on('input propertychange',function(){ alert('输入一个字弹一回'); });

  7. 【FAQ】tomcat启动jdk版本不一致

    一.tomcat7.exe与startup.bat的区别: 1.这两个都可以启动tomcat,但tomcat7.exe必须安装了服务才能启动,而startup.bat不需要 2.另外一个区别是它们启动 ...

  8. 「工具」三分钟了解一款在线流程绘制工具:Whimsical

    Whimsical 是一款在线流程绘制工具,只需要一个浏览器就随时随地绘制精美的流程图.除了流程图(Flowcharts)功能,官方还推出了线框图(Wireframes).便利贴(Sticky Not ...

  9. jQuery 事件注册

    重点事件注册.on() <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset= ...

  10. shell-012:批量创建用户

    # #!/bin/bash # 批量创建用户 # 分析:用命令给用户创建密码的方法有两种 # . 可以直接用echo的方法 # echo "abc-123" |passwd roo ...