zoukankan      html  css  js  c++  java
  • 【译文】JNI编程

    原文链接: https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html  

    没有逐字翻译,解说了文章的大致意思,需要了解细节的请看原文~

    1. 介绍: 

      有时候我们需要Native code(c/c++)来克服Java中的内存管理和性能约束。 Java通过JVM提供的JNI功能达到了这个目的。JNI涉及到两种语言和运行时环境,所以比较难点。这里我假设你对Java,c/c++,相关IDE比较熟悉。

    2. 开始

    2.1   在Java中使用C: 

    1. 在Java类中声明相应的方法为native方法
    2. 使用javah工具生成相应的头文件
    3. 编写对应的c源文件(包含对应的头文件,实现里面声明的函数)
    4. 编写Makefile
    5. 运行包含main方法的Java类(注意设置java.library.path变量)

    2.2  在Java中混合c/c++

      主要问题是,要明白如何在c源文件中调用c++函数(函数声明的时候要注意使用extern “C")

    2.3   JNI相关的包问题

      如果包含native方法的类不是在默认包里,就涉及到这个问题,在使用javah的时候需要注意切换到package base directory。

    2.4  JNI在Eclipse中的使用  

       

    3. JNI基础

    1.  Java的原始类型:JNI 中的类型和对应的Java中的类型 
      jint jbyte jshort jlong jfloat jdouble jchar jboolean 
      int   byte  short  long  float  double  char  boolean
    2. Java的引用类型(reference type): jobject 对应 java.lang.Object
      1. jclass 对应 java.lang.Class
      2. jstring 对应java.lang.String
      3. jthrowable 对应java.lang.Throwable
      4. jarray表示Java的数组
    3.  native函数接收Java程序传入的参数,然后转换为本地类型,计算完毕后,把本地结果拷贝到JNItype类型的对象中,然后返回

    4. 参数和结果传递

    4.1  传递原始类型(primitives)

    4.2  传递字符串

    // UTF-8 String (encoded to 1-3 byte, backward compatible with 7-bit ASCII)
    // Can be mapped to null-terminated char-array C-string
    const char * GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy);
       // 返回jstring对象中的内部c字符串
    void ReleaseStringUTFChars(JNIEnv *env, jstring string, const char *utf);
       // 告诉虚拟机native code不再需要访问jstring的utf
    jstring NewStringUTF(JNIEnv *env, const char *bytes);
       //新创建一个java.lang.String 对象
    jsize GetStringUTFLength(JNIEnv *env, jstring string);
       // Returns the length in bytes of the modified UTF-8 representation of a string.
    void GetStringUTFRegion(JNIEnv *env, jstring str, jsize start, jsize length, char *buf);
       // Translates len number of Unicode characters beginning at offset start into modified UTF-8 encoding 
       // and place the result in the given buffer buf
    View Code

    4.3  传递原始类型的数组

    5. 访问对象

    (如何在native code中修改Java对象的值)

     5.1  实例变量

     5.2  类的静态变量

     5.3  方法调用

     5.4 调用overridden的方法

     6. 创建对象和对象数组

     7. Local和Global 引用  

     1 classInteger = (*env)->FindClass(env, "java/lang/Integer");  //这里获得是Local 引用,即使保存的全局变量里,下次也不能使用,所以需要重新申请,或者像下面这样:
     2 
     3    // Get a class reference for java.lang.Integer if missing
     4    if (NULL == classInteger) {
     5       printf("Find java.lang.Integer
    ");
     6       // FindClass returns a local reference
     7       jclass classIntegerLocal = (*env)->FindClass(env, "java/lang/Integer");
     8       // Create a global reference from the local reference
     9       classInteger = (*env)->NewGlobalRef(env, classIntegerLocal);
    10       // No longer need the local reference, free it!
    11       (*env)->DeleteLocalRef(env, classIntegerLocal);
    12    }

    原文链接: https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html 

  • 相关阅读:
    NVelocity实现违反了LSP法则,使我的一个低级错误排查了一个下午。
    ADO.NET EF 4中 query.Where().Where()和动态组合lambda实现组合查询的不同。
    发现blend4的一个导致崩溃的BUG!!!
    代码回滚:git reset、git checkout和git revert区别和联系
    精确获取函数运行时间,精确到微秒
    在github分支上上传空文件夹
    VS2010 LINK1123:failure during conversion to COFF:file invalid or corrupt
    同步github上fork出来的分支
    未能找到任何适合于指定的区域性或非特定区域性的资源。请确保在编译时已将“XXXXX.resources”正确嵌入或链接到程序集“XX”,或者确保所有需要的附属程序集都可加载并已进行了完全签名。
    决定以后把写博客转的主要平台转到cnblogs了
  • 原文地址:https://www.cnblogs.com/ridox/p/4451830.html
Copyright © 2011-2022 走看看