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. hdu 1558(计算几何+并查集)

    Segment set Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. javascript原型理解一种

    http://www.jianshu.com/p/15ac7393bc1f 这个系列值得好好学习的.. // 声明构造函数 function Person(name, age) { this.name ...

  3. JDK7集合框架源码阅读(一) ArrayList

    基于版本jdk1.7.0_80 java.util.ArrayList 代码如下 /* * Copyright (c) 1997, 2013, Oracle and/or its affiliates ...

  4. HDU 2639 Bone Collector II【01背包 + 第K大价值】

    The title of this problem is familiar,isn't it?yeah,if you had took part in the "Rookie Cup&quo ...

  5. request与response对象.

    request与response对象. 1. request代表请求对象 response代表的响应对象. 学习它们我们可以操作http请求与响应. 2.request,response体系结构. 在 ...

  6. [Math Review] Statistics Basics: Main Concepts in Hypothesis Testing

    Case Study The case study Physicians' Reactions sought to determine whether physicians spend less ti ...

  7. MySQL四种类型日志:Error Log、General Query Log、Binary Log、Slow Query Log

    MySQL Server 有四种类型的日志——Error Log.General Query Log.Binary Log 和 Slow Query Log. 第一个是错误日志,记录mysqld的一些 ...

  8. 【Linux】Linux下 环境变量/etc/profile、/etc/bashrc、~/.bashrc的区别【转】

    转自:http://blog.csdn.net/qiao1245/article/details/44650929 ------------------------------------------ ...

  9. VUE -- 安装新模块

  10. ubuntu16 安装cron 以及使用

    https://www.cnblogs.com/intval/p/5763929.html sudo apt-get install cron 启动cron sudo service cron sta ...