Java与原生代码通信涉及到原生方法声明与定义、数据类型、引用数据类型操作、NIO操作、訪问域、异常处理、原生线程

1、原生方法声明与定义

关于原生方法的声明与定义在上一篇已经讲一点了,这次具体分析一下。依据javah自己主动生成的头文件。能够看出原生方法的声明和定义,比如:

JNIEXPORT  jstring JNICALL Java_com_shamoo_helljni_HelloJni_stringFromJNI(JNIEnv *, jobject);

虽然Java上的原生方法没有不论什么參数,但还是JNI接口的原生方法还是带有两个參数。JNIEnv *是指向JNI函数表的接口指针,jobject是调用该方法的Java对象引用。从上述方法能够看出。该方法的在Java代码中的com.shamoo.helljni包。类是HelloJni。

JNIEnv *指针:原生方法通过JNIEnv *指针提供的各种函数来使用虚拟机的功能。

原生方法在C和C++的调用方式不同。比如:

/* C */
return (*env)->NewStringUTF(env, "Hello World");
/* C++ */
return env->NewStringUTF("Hello World");

在C语言中。JNIEnv是指向JNINativeInterface结构的指针,使用它必需要解引用。而第一个參数还是env,学过C和C++语言都知道。C语言是面向过程语言,NewStringUTF仅仅是一个函数指针。调用该方法还不清楚调用者,所以要传递env,而C++就不用。由于C++是面向对象语言。这个就不解释咯

2、实例方法与静态方法

原生方法的实例方法和静态方法定义也不同。上述的stringFromJNI就是实例方法定义的方式。第二參数绑定的是Java的对象引用。而静态方法的第二个參数是jclass,是与类绑定的。属于类方法。比如:

JNIEXPORT  jstring JNICALL Java_com_shamoo_helljni_HelloJni_stringFromJNI(JNIEnv *, jclass);

3、数据类型

Java的基本数据类型在JNI就直接在前面加个j就是了,比如Java的int相应的是jint...

Java的引用类型与基本数据类型不同,相应关系例如以下:

java.lang.Class  -> jclass

java.lang.Throwable -> jthrowable

java.lang.String -> jstring

java.lang.Object -> jobject

数组就直接在后面加Array即可了,比如byte[] -> jbyteArray、Object[] -> jobjectArray...

Android NDK开发篇(四):Java与原生代码通信(原生方法声明与定义与数据类型)的更多相关文章

  1. Android NDK开发篇:Java与原生代码通信(原生方法声明与定义与数据类型)

    Java与原生代码通信涉及到原生方法声明与定义.数据类型.引用数据类型操作.NIO操作.访问域.异常处理.原生线程 1.原生方法声明与定义 关于原生方法的声明与定义在上一篇已经讲一点了,这次详细分析一 ...

  2. Android NDK开发篇:Java与原生代码通信(数据操作)

    虽然说使用NDK可以提高Android程序的执行效率,但是调用起来还是稍微有点麻烦.NDK可以直接使用Java的原生数据类型,而引用类型,因为Java的引用类型的实现在NDK被屏蔽了,所以在NDK使用 ...

  3. Android NDK开发篇:Java与原生代码通信(异常处理)

    一.捕获异常 异常处理是Java中的功能,在Android中使用SDK进行开发的时候经常要用到.Android原生代码在执行过程中如果遇到错误,需要检测,并抛出异常给Java层.执行原生代码出现了问题 ...

  4. Android NDK开发 JNI操作java构造方法,普通方法,静态方法(七)

    Android NDK开发 JNI操作java普通.静态.构造方法 1.Jni实例化一个Java类的实例jobject 1.通过FindClas( ),获取Java类的的jclass 2.通过GetM ...

  5. Android NDK 开发(四)java传递数据到C【转】

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/41845701 前面几篇文章介绍了Android NDK开发的简单概念.常见错误及处 ...

  6. Android NDK开发篇(五):Java与原生代码通信(数据操作)

    尽管说使用NDK能够提高Android程序的运行效率,可是调用起来还是略微有点麻烦.NDK能够直接使用Java的原生数据类型,而引用类型,由于Java的引用类型的实如今NDK被屏蔽了,所以在NDK使用 ...

  7. Android NDK开发篇(六):Java与原生代码通信(异常处理)

    一.捕获异常 异常处理是Java中的功能.在Android中使用SDK进行开发的时候常常要用到.Android原生代码在运行过程中假设遇到错误,须要检測,并抛出异常给Java层.运行原生代码出现了问题 ...

  8. Android NDK开发 字符串(四)

    几个概念首先要明确: java内部是使用16bit的unicode编码(UTF-16)来表示字符串的,无论中文英文都是2字节: jni内部是使用UTF-8编码来表示字符串的,UTF-8是变长编码的un ...

  9. Android NDK开发三:java和C\C++交互

    转自:http://www.cnblogs.com/shangdahao/archive/2013/05/02/3053971.html 1.定义native方法并加载动态链接库: public cl ...

随机推荐

  1. 处理eq问题

    using System;using System.Diagnostics;using System.Drawing;using System.IO;using System.Windows.Form ...

  2. 使用iframe实现页面无刷新提交表单

    iframe提交表单其实比ajax要方便一些,当然ajax也有ajax的好处,只是ajax编码处理有时有些麻烦,虽然经过转码是可以解决中文问题,但如果直接使用iframe不存这些问题了,下面来看看. ...

  3. Mobius反演与积性函数前缀和演学习笔记 BZOJ 4176 Lucas的数论 SDOI 2015 约数个数和

    下文中所有讨论都在数论函数范围内开展. 数论函数指的是定义域为正整数域, 且值域为复数域的函数. 数论意义下的和式处理技巧 因子 \[ \sum_{d | n} a_d = \sum_{d | n} ...

  4. response.getWriter().write()与out.print()的区别(转)

    1.首先介绍write()和print()方法的区别: (1).write():仅支持输出字符类型数据,字符.字符数组.字符串等 (2).print():可以将各种类型(包括Object)的数据通过默 ...

  5. My first blog on cnBlogs!

    以后会长期更新自己的心得体会!以此锻炼自己,奋发向前.

  6. ios中调用WCF

    例子比较简单 记录下思路 1.接口中定义 实体和方法声明 //登录信息        [OperationContract]        [WebInvoke(UriTemplate = " ...

  7. linux的file指令

    显示文件的类型,用命令 file 可以使你知道某个文件究竟是ELF格式的可执行文件, 还是shell script文 件或是其他的什么格式 例如:#file startx 语 法:file [-beL ...

  8. 【微信】2.微信小程序开发--官方开发工具使用说明

    承接第一篇 =============================================== 关于微信小程序开发使用IDE,曾经自己动摇过. 到底是采用 微信官方小程序开发工具 WebS ...

  9. tshop-pbsm-shop-nav-ch结构和样式分析

    html结构 <div id="content" class="eshop head-expand tb-shop"> <div id=&qu ...

  10. C# Json格式字符串

    转自:http://www.cnblogs.com/unintersky/p/3884712.html 将Json字符串转化成格式化表示的方法: 字符串反序列化为对象-->对象再序列化为字符串 ...