zoukankan      html  css  js  c++  java
  • JNI环境变量——JNIEnv*的使用 &&配置jd环境变量

     

    如果没有配置环境变量,先配置环境变量,如下:

    1、右键我的电脑——高级——环境变量——下面的系统变量

    2、选择【新建系统变量】--弹出“新建系统变量”对话框,在“变量名”文本框输入“JAVA_HOME”,在“变量值”文本框输入JDK的安装路径,单击“确定”。

    3、在“系统变量”选项区域中查看PATH变量,如果不存在,则新建变量 PATH,否则选中该变量,单击“编辑”按钮,在“变量值”文本框的起始位置添加“%JAVA_HOME%in;%JAVA_HOME%jre in;”或者是直接“%JAVA_HOME%in;”

    4、在“系统变量”选项区域中查看CLASSPATH 变量,如果不存在,则新建变量CLASSPATH,否则选中该变量,单击“编辑”按钮,在“变量值”文本框的起始位置添加 “.;%JAVA_HOME%libdt.jar;%JAVA_HOME%lib ools.jar;”

    5、现在测试环境变量的配置成功与否。在DOS命令行窗口输入“JAVAC”,输出帮助信息即为配置正确

     6、 在命令行下输入以下命令: java -version 将显示JDK的版本信息

    先看现象:

    1. .h文件

    JNIEXPORT jintArray JNICALL Java_com_example_testjni_MainActivity_getByteArrayFromC
      (JNIEnv *, jobject, jcharArray);

    2. .c主函数

    JNIEXPORT jintArray JNICALL Java_com_example_testjni_MainActivity_getByteArrayFromC
      (JNIEnv * env, jobject jobj, jcharArray jcarr){
     jcarr.
     return (*env)->NewIntArray(env,cstr);
    }

    3. .c成员函数

    /**
     * 返回值 char* 这个代表char数组的首地址
     *  Jstring2CStr 把java中的jstring的类型转化成一个c语言中的char 字符串
     */
    char*   Jstring2CStr(JNIEnv*   env,   jstring   jstr)
    {
      char*   rtn   =   NULL;
      jclass   clsstring   =   (*env)->FindClass(env,"java/lang/String"); //String
      jstring   strencode   =   (*env)->NewStringUTF(env,"GB2312");  // 得到一个java字符串 "GB2312"
      jmethodID   mid   =   (*env)->GetMethodID(env,clsstring,   "getBytes",   "(Ljava/lang/String;)[B"); //[ String.getBytes("gb2312");
      jbyteArray   barr=   (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode); // String .getByte("GB2312");
      jsize   alen   =   (*env)->GetArrayLength(env,barr); // byte数组的长度
      jbyte*   ba   =   (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
      if(alen   >   0)
      {
       rtn   =   (char*)malloc(alen+1);         //""
       memcpy(rtn,ba,alen);
       rtn[alen]=0;
      }
      (*env)->ReleaseByteArrayElements(env,barr,ba,0);  //
      return rtn;
    }

    4. jni.h中的静态函数

    接口: jmethodID   (*FromReflectedMethod)(JNIEnv*, jobject);

    函数: jintArray     (*NewIntArray)(JNIEnv*, jsize);

    重载: jintArray NewIntArray(jsize length)
        { return functions->NewIntArray(this, length); }

    发现:

    所有的JNI调用都使用了JNIEnv*类型的指针,习惯上在CPP文件中将这个变量定义为env,它是任意一个本地方法的第一个参数。env指针指向一个函数指针表,在VC中可以直接用"->"操作符访问其中的函数。

        jobject 指向在此 Java 代码中实例化的 Java 对象 LocalFunction的一个句柄,相当于this指针。后续的参数就是本地调用中有Java程序传进的参数,本例中只有一个String型参数。对于字符串型参数,因为在本地代码中不能直接读取Java字符串,而必须将其转换为C/C++字符串或Unicode。以下是我们经常会用到的字符串类型处理的函数:

    (1)   const char* GetStringUTFChars (jstring string,jboolean* isCopy)
    返回指向字符串UTF编码的指针,如果不能创建这个字符数组,返回null。这个指针在调用ReleaseStringUTFChar()函数之前一直有效。 参数:
    string Java字符串对象 
    isCopy 如果进行拷贝,指向以JNI_TRUE填充的jboolean,否则指向以JNI_FALSE填充的jboolean。

    (2)   void ReleaseStringUTFChars(jstring str, const char* chars)
    通知虚拟机本地代码不再需要通过chars访问Java字符串。 
    参数:
    string Java字符串对象 
    chars 由GetStringChars返回的指针

    (3)   jstring NewStringUTF(const char *utf)
    返回一个新的Java字符串并将utf内容拷贝入新串,如果不能创建字符串对象,返回null。通常在反值类型为string型时用到。 
    参数:
    utf UTF编码的字符串指针,对于数值型参数,在C/C++中可直接使用,其字节宽度如下所示:

    对于上述类型数组,有一组函数与之对应,以下函数中Xxx为对应类型。
    xxx* GetXxxArrayElements(xxxArray array, jboolean *isCopy)
    产生一个指向Java数组元素的C指针。不再需要时,需将此指针传给Relea***xxArrayElements
    参数:
    array 数组对象 
    isCopy 如果进行拷贝,指向以JNI_TRUE填充的jboolean,否则指向以JNI_FALSE填充的jboolean。 
    例如:jboolean * GetBooleanArrayElements(jbooleanArray array, jboolean *isCopy)

    (4)   void Relea***xxArrayElements(xxxArray array,xxx *elems, jint mode)
    通知虚拟机不再需要从GetXxxArrayElements得到的指针。 
    参数:
    array 数组对象 
    elems 不再需要的指向数组元素的指针 
    mode 0=在更新数组元素后释放elems缓冲器 
    JNI_COMMIT=在更新数组元素后不释放elems缓冲器 
    JNI_ABORT=不更新数组元素释放elems缓冲器 
    例如:void ReleaseBooleanArrayElements(jbooleanArray array,jboolean *elems, jint mode)

    (5)   xxxArray NewXxxArray(jsize len)
    产生一个新的数组,通常在反值类型为数组型时用到。
    参数:
    len 数组中元素的个数。 
    例如:jbooleanArray NewBooleanArray(jsize len)

    http://blog.csdn.net/omg_2012/article/details/8175398

  • 相关阅读:
    201671010145 20162017 《Java程序设计》java的继承中什么叫方法覆盖,是如何实现的?
    201671010145 20162017《Java程序设计》Java接口的功能
    Java与C语言的区别
    201671010145 201620173《Java程序设计》Java中类与对象的区别
    Java 加密算法
    Java 基础
    Java 新建线程时使用线程池处理
    sublime text 3安装
    C语言的基本数据类型
    有点跑题的随笔
  • 原文地址:https://www.cnblogs.com/langtianya/p/3717629.html
Copyright © 2011-2022 走看看