zoukankan      html  css  js  c++  java
  • Java中JNI的使用详解第二篇:JNIEnv类型和jobject类型的解释

    上一篇说的是一个简单的应用,说明JNI是怎么工作的,这一篇主要来说一下,那个本地方法sayHello的参数的说明,以及其中方法的使用

    首先来看一下C++中的sayHello方法的实现:

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. JNIEXPORT void JNICALL Java_com_jni_demo_JNIDemo_sayHello (JNIEnv * env, jobject obj)  
    2. {  
    3. cout<<"Hello World"<<endl;  
    4. }  

    对于这个方法参数中的JNIEnv* env参数的解释:

    JNIEnv类型实际上代表了Java环境,通过这个JNIEnv* 指针,就可以对Java端的代码进行操作。例如,创建Jaa类中俄对象,调用Java对象的方法,获取Java对象中的属性等等。JNIEnv的指针会被JNI传入到本地方法的实现函数中来对Java端的代码进行操作。

    JNIEnv类中有很多函数可以用:

    NewObject:创建Java类中的对象

    NewString:创建Java类中的String对象

    New<Type>Array:创建类型为Type的数组对象

    Get<Type>Field:获取类型为Type的字段

    Set<Type>Field:设置类型为Type的字段的值

    GetStatic<Type>Field:获取类型为Type的static的字段

    SetStatic<Type>Field:设置类型为Type的static的字段的值

    Call<Type>Method:调用返回类型为Type的方法

    CallStatic<Type>Method:调用返回值类型为Type的static方法

    等许多的函数,具体的可以查看jni.h文件中的函数名称。

    参数:jobject obj的解释:

    如果native方法不是static的话,这个obj就代表这个native方法的类实例

    如果native方法是static的话,这个obj就代表这个native方法的类的class对象实例(static方法不需要类实例的,所以就代表这个类的class对象)

    下面来看一下Java和C++中的基本类型的映射关系:

    具体的说明可以查看jni.h文件。

    为了能够在C/C++中使用Java类,jni.h头文件中专门定义了jclass类型来表示Java中的Class类

    JNIEnv类中有如下几个简单的函数可以取得jclass:

    jclass FindClass(const char* clsName):通过类的名称(类的全名,这时候包名不是用.号,而是用/来区分的)来获取jclass

    如: jclass str = env->FindClass("java/lang/String");获取Java中的String对象的class对象。

    jclass GetObjectClass(jobject obj):通过对象实例来获取jclass,相当于java中的getClass方法

    jclass GetSuperClass(jclass obj):通过jclass可以获取其父类的jclass对象

    在C/C++本地代码中访问Java端的代码,一个常见的应用就是获取类的属性和调用类的方法,为了在C/C++中表示属性和方法,JNI在jni.h头文件中定义了jfieldId,jmethodID类型来分别代表Java端的属性和方法

    我们在访问,或者设置Java属性的时候,首先就要先在本地代码取得代表该Java属性的jfieldID,然后才能在本地代码中进行Java属性操作,同样的,我们需要呼叫Java端的方法时,也是需要取得代表该方法的jmethodID才能进行Java方法调用

    使用JNIEnv的:

    GetFieldID/GetMethodID

    GetStaticFieldID/GetStaticMethodID

    来取得相应的jfieldID和jmethodID

    下面来具体看一下这几个方法:

    GetFieldID(jclass clazz,const char* name,const char* sign)

    方法的参数说明:

    clazz:这个简单就是这个方法依赖的类对象的class对象

    name:这个是这个字段的名称

    sign:这个是这个字段的签名(我们知道每个变量,每个方法都是有签名的)

    怎么查看类中的字段和方法的签名:

    使用javap命令:

    GetMethodID也能够取得构造函数的jmethodID,创建一个Java对象时可以调用指定的构造方法,这个将在后面向大家介绍:

    如:env->GetMethodID(data_Class,"<init>","()V");

    下面看一下签名的格式:

    下面来看一下例子:

    这里没有上代码了:真正演示的时候等下一篇内容,这一篇只是说一下方法的使用:

    原创:http://blog.csdn.net/jiangwei0910410003/article/details/17465457

  • 相关阅读:
    CodeForces 706C Hard problem
    CodeForces 706A Beru-taxi
    CodeForces 706B Interesting drink
    CodeForces 706E Working routine
    CodeForces 706D Vasiliy's Multiset
    CodeForces 703B Mishka and trip
    CodeForces 703C Chris and Road
    POJ 1835 宇航员
    HDU 4907 Task schedule
    HDU 4911 Inversion
  • 原文地址:https://www.cnblogs.com/Ph-one/p/4423015.html
Copyright © 2011-2022 走看看