zoukankan      html  css  js  c++  java
  • Android NDK开发篇(四):Java与原生代码通信(原生方法声明与定义与数据类型)

      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...

  • 相关阅读:
    ubuntu 用shell脚本实现将当前文件夹下全部文件夹中的某一类文件复制到同一文件夹下
    读书笔记-2java虚拟机的可达性算法与finalize方法
    find the longest of the shortest (hdu 1595 SPFA+枚举)
    杭电 2176 取(m堆)石子游戏(博弈)
    MVC框架的优缺点
    Wireshark-TCP协议分析(包结构以及连接的建立和释放)
    Ubuntu安装教程--Win7系统中含100M保留分区
    eclipse新建android项目出现非常多错误
    关于简单的加密和解密算法
    在一台server上部署多个Tomcat
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/6761699.html
Copyright © 2011-2022 走看看