zoukankan      html  css  js  c++  java
  • Android JNI开发摘录(一)之JNI串处理

           Java本机接口

           JNI提供许多函数,例如串和数组的处理,以及创建和使用Java对象的一个完整函数集。这些函数都使用一个指向Java环境的指针作为第一个参数。然而为了简化编程,这些函数都在JNIEnv结构中定义了一个别名。这就意味着可以通过指向Java环境的指针JNIEnv来调用任意的JNI函数。以下依次介绍JNIEnv结构中定义的函数。

         NDK编译命令:$NDK/ndk-build -C [Project Path]      如:$NDK/ndk-build -C D:/Android/MyProject

         获取方法和变量描述符的编译命令:javap -s -classpath . [PacketName+"."+Library Name]  如:javap -s -classpath . com.example.MyProject.MyLibrary

         编译JNI头文件的命令(需要在开始包名(即com)的上一级目录调用):javah -classpath .  [PacketName+"."+Library Name]  如:javah -classpath .  com.example.MyProject.MyLibrary

         调用JNI函数用两种方式:

       //For C:

        (*env)->NewStringUTF(env,"Hello World!");  

      //As alternative

       (**env).NewStringUTF(env,"Hello World!");

     

      //For C++:

        env->NewStringUTF("Hello World!");

     

          一. 数据类型

         JNI环境中使用的数据类型称为本机类型,下面是基本类型和本机类型的对应关系表。

    基本类型

    本机类型

    长度/bit

    boolean

    jboolean

    8,无符号(1Byte

    byte

    jbyte

    8

    char

    jchar

    16

    short

    jshort

    16

    int

    jint

    32

    long

    jlong

    64

    float

    jfloat

    32

    double

    jdouble

    64

    void

    void

    n/a

          二. JNI中的串处理函数

         1.新建jstring

    1 jstring NewString(const jchar *unicodeChars, jsize len);//创建Unicode格式的jstring串
    2
    3 jstring NewStringUTF(const char *bytes); //创建UTF-8格式的jstring串

     

        2.获取字符串长度

       

    jsize GetStringLength(jstring string);//Unicode

    jsize GetStringUTFLength(jstring string);//UTF-8

     

         3.jstring转化为C串及释放jstring

     

    /**

    *如果生成串的一个副本,isCopy参数将被置为JNI_TRUE,否则置为

    *NULL或者JNI_FALSE

    */

    const jchar* GetStringChars(jstring string, jboolean *isCopy);

    const char* GetStringUTFChars(jstring string, jboolean *isCopy );

         注:这两个函数返回一个指向特定jstring中字符顺序的指针,该指针保持有效直到下面的函数被调用:

     

    void ReleaseStringChars(jstring string, const jchar *chars);

    void ReleaseStringUTFChars(jstring string, const char *utf);



         GetStringRegion函数将串str的一个子串传送到一个字符缓存器。该子串在位置start处开始,在len-1处结束(这样传送的字符数就是len)。这将会抛出一个StringIndexOutOfBoundsException:

    void GetStringRegion(jstring str, jsize start, jsize len, jchar *buf);

    void GetStringUTFRegion(jstring str, jsize start, jsize len, char *buf);

         GetStringCritical函数返回一个指向特定串中字符的指针。如果有必要,复制该字符,并且函数返回时将isCopy置为JNI_TRUE,否则置为NULLJNI_FALSE。在调用该函数后,直至调    用ReleaseStringCritical之前,所使用的所有函数都无法使当前线程被阻塞:

     

    const jchar* GetStringCritical(jstring string, jboolean *isCopy);

    void ReleaseStringCritical(jstring string,const jchar *carray);



  • 相关阅读:
    webrtcvad模块使用
    pyroomacoustics--生成房间脉冲响应
    virtualbox设置了共享文件夹却无权限访问
    机器学习-高斯判别分析
    机器学习--线性判别分析
    阵列信号处理-波束加权
    线性分类-感知机
    vbox虚拟机扩容(CentOS 7.2)
    安装MySQLdb模块遭遇"fatal error: my_config.h: No such file or directory"的处理
    使用git bash编译安装sysbench时遇到的坑
  • 原文地址:https://www.cnblogs.com/oxgen/p/2380277.html
Copyright © 2011-2022 走看看