android - Jni Environment 函数

typedef const struct JNINativeInterface *JNIEnv;


const struct JNINativeInterface ... = {


    NULL,
    NULL,
    NULL,
    NULL,
    GetVersion,             //获取JNI版本号


    DefineClass,             //通过指定ClassLoader对象加载类
    FindClass,             //获取指定的Class类对象


    FromReflectedMethod,    //通过指定的java.lang.reflect.Method对象获取方法ID
    FromReflectedField,    //通过指定的java.lang.reflect.Field对象获取字段ID
    ToReflectedMethod,    //通过指定的方法ID获取java.lang.reflect.Method对象


    GetSuperclass,         //获取指定类的父类
    IsAssignableFrom,         //判断指定类是否继承自某类或实现了某个接口


    ToReflectedField,         //通过指定的字段ID获取java.lang.reflect.Field对象


    Throw,                 //抛出指定的Throwable对象
    ThrowNew,             //抛出指定的Throwable对象,并制定消息
    ExceptionOccurred,     //获取未被清空或捕获的异常
    ExceptionDescribe,     //同printStackTrace()
    ExceptionClear,         //清除已被抛出的异常
    FatalError,             //抛出致命错误


    PushLocalFrame,   //Push/PopLocalFrame函数提供了本地引用管理的简便方法,在该函数对之间的代码段,所有创建的显式本地引用无需手动调用DeleteLocalReference函数释放,PopLocalFrame函数会自动释放这些本地引用
    PopLocalFrame,


    NewGlobalRef,         //创建全局引用,必须被显式清除
    DeleteGlobalRef,         //清除全局引用
    DeleteLocalRef,         //清除本地引用,通常本地引用在原生代码返回时会自动清除,但是对于大数据,比如在循环中频繁创建Java对象,而该对象的只在一次循环中有效,这种情况下有必要显式调用DeleteLocalRef以通知VM尽快释放该对象。
    IsSameObject,         //判断是否为同一对象,可通过该方法判断弱引用是否已被释放(NULL)
    NewLocalRef,             //创建本地引用
    EnsureLocalCapacity,     //确保当前线程可以创建指定数量的本地引用


    AllocObject,             //创建一个新的对象,只分配内存,不调用任何构造方法(cdwang:应该是为了方便通过CallNonvirtual<Type>Method方法调用父类的构造函数初始化对象)
    NewObject,             //通过指定的构造函数创建对象,变长参数形式
    NewObjectV,             //同上,va_list形式
    NewObjectA,             //同上,数组形式


    GetObjectClass,         //获取对象的Class类对象
    IsInstanceOf,             //同instanceOf


    GetMethodID,         //获取实例(非静态)方法的ID


    CallObjectMethod,     //调用实例方法,object表示返回值类型
    CallObjectMethodV,
    CallObjectMethodA,
    CallBooleanMethod,
    CallBooleanMethodV,
    CallBooleanMethodA,
    CallByteMethod,
    CallByteMethodV,
    CallByteMethodA,
    CallCharMethod,
    CallCharMethodV,
    CallCharMethodA,
    CallShortMethod,
    CallShortMethodV,
    CallShortMethodA,
    CallIntMethod,
    CallIntMethodV,
    CallIntMethodA,
    CallLongMethod,
    CallLongMethodV,
    CallLongMethodA,
    CallFloatMethod,
    CallFloatMethodV,
    CallFloatMethodA,
    CallDoubleMethod,
    CallDoubleMethodV,
    CallDoubleMethodA,
    CallVoidMethod,
    CallVoidMethodV,
    CallVoidMethodA,


    CallNonvirtualObjectMethod, //调用非虚实例方法,通过class对象指定调用哪个类的非虚函数(cdwang:应该是某对象不调用自己的构造类的方法实现,而是调用父类的方法实现,这个方法节省了子类对象向父类对象的强制转换)
    CallNonvirtualObjectMethodV,
    CallNonvirtualObjectMethodA,
    CallNonvirtualBooleanMethod,
    CallNonvirtualBooleanMethodV,
    CallNonvirtualBooleanMethodA,
    CallNonvirtualByteMethod,
    CallNonvirtualByteMethodV,
    CallNonvirtualByteMethodA,
    CallNonvirtualCharMethod,
    CallNonvirtualCharMethodV,
    CallNonvirtualCharMethodA,
    CallNonvirtualShortMethod,
    CallNonvirtualShortMethodV,
    CallNonvirtualShortMethodA,
    CallNonvirtualIntMethod,
    CallNonvirtualIntMethodV,
    CallNonvirtualIntMethodA,
    CallNonvirtualLongMethod,
    CallNonvirtualLongMethodV,
    CallNonvirtualLongMethodA,
    CallNonvirtualFloatMethod,
    CallNonvirtualFloatMethodV,
    CallNonvirtualFloatMethodA,
    CallNonvirtualDoubleMethod,
    CallNonvirtualDoubleMethodV,
    CallNonvirtualDoubleMethodA,
    CallNonvirtualVoidMethod,
    CallNonvirtualVoidMethodV,
    CallNonvirtualVoidMethodA,


    GetFieldID,             //获取成员字段ID


    GetObjectField,         //获取字段值
    GetBooleanField,
    GetByteField,
    GetCharField,
    GetShortField,
    GetIntField,
    GetLongField,
    GetFloatField,
    GetDoubleField,
    SetObjectField,         //设置字段值
    SetBooleanField,
    SetByteField,
    SetCharField,
    SetShortField,
    SetIntField,
    SetLongField,
    SetFloatField,
    SetDoubleField,


    GetStaticMethodID,     //获取静态方法ID


    CallStaticObjectMethod, //调用静态方法
    CallStaticObjectMethodV,
    CallStaticObjectMethodA,
    CallStaticBooleanMethod,
    CallStaticBooleanMethodV,
    CallStaticBooleanMethodA,
    CallStaticByteMethod,
    CallStaticByteMethodV,
    CallStaticByteMethodA,
    CallStaticCharMethod,
    CallStaticCharMethodV,
    CallStaticCharMethodA,
    CallStaticShortMethod,
    CallStaticShortMethodV,
    CallStaticShortMethodA,
    CallStaticIntMethod,
    CallStaticIntMethodV,
    CallStaticIntMethodA,
    CallStaticLongMethod,
    CallStaticLongMethodV,
    CallStaticLongMethodA,
    CallStaticFloatMethod,
    CallStaticFloatMethodV,
    CallStaticFloatMethodA,
    CallStaticDoubleMethod,
    CallStaticDoubleMethodV,
    CallStaticDoubleMethodA,
    CallStaticVoidMethod,
    CallStaticVoidMethodV,
    CallStaticVoidMethodA,


    GetStaticFieldID,         //获取静态字段ID


    GetStaticObjectField,     //获取字段值
    GetStaticBooleanField,
    GetStaticByteField,
    GetStaticCharField,
    GetStaticShortField,
    GetStaticIntField,
    GetStaticLongField,
    GetStaticFloatField,
    GetStaticDoubleField,


    SetStaticObjectField,     //设置字段值
    SetStaticBooleanField,
    SetStaticByteField,
    SetStaticCharField,
    SetStaticShortField,
    SetStaticIntField,
    SetStaticLongField,
    SetStaticFloatField,
    SetStaticDoubleField,


    NewString,             //通过指定Unicode格式字符数组构造Java String


    GetStringLength,         //获取Unicode字符的长度
    GetStringChars,         //获取字符数组
    ReleaseStringChars,     //通知VM可以释放String和由GetStringChars获取的字符数组
 
    NewStringUTF,         //通过指定UTF-8格式字符数组构造Java String
    GetStringUTFLength,
    GetStringUTFChars,
    ReleaseStringUTFChars,
 
    GetArrayLength,         //获取数组长度www.2cto.com
 
    NewObjectArray,         //通过指定的Class类对象和初始元素初始化一个Java对象数组
    GetObjectArrayElement,    //获取指定索引的对象元素
    SetObjectArrayElement,    //设置指定索引的对象元素
 
    NewBooleanArray,     //构造基本类型的Java数组
    NewByteArray,
    NewCharArray,
    NewShortArray,
    NewIntArray,
    NewLongArray,
    NewFloatArray,
    NewDoubleArray,
 
    GetBooleanArrayElements,    //获取基本类型元素的C数组
    GetByteArrayElements,
    GetCharArrayElements,
    GetShortArrayElements,
    GetIntArrayElements,
    GetLongArrayElements,
    GetFloatArrayElements,
    GetDoubleArrayElements,
 
    ReleaseBooleanArrayElements,    //通知VM可以释放Java数组和由前述方法族获取的C数组
    ReleaseByteArrayElements,
    ReleaseCharArrayElements,
    ReleaseShortArrayElements,
    ReleaseIntArrayElements,
    ReleaseLongArrayElements,
    ReleaseFloatArrayElements,
    ReleaseDoubleArrayElements,
 
    GetBooleanArrayRegion,    //获取子数组
    GetByteArrayRegion,
    GetCharArrayRegion,
    GetShortArrayRegion,
    GetIntArrayRegion,
    GetLongArrayRegion,
    GetFloatArrayRegion,
    GetDoubleArrayRegion,
    SetBooleanArrayRegion,    //设置子数组
    SetByteArrayRegion,
    SetCharArrayRegion,
    SetShortArrayRegion,
    SetIntArrayRegion,
    SetLongArrayRegion,
    SetFloatArrayRegion,
    SetDoubleArrayRegion,
 
    RegisterNatives,         //映射原生代码
    UnregisterNatives,
 
    MonitorEnter,
    MonitorExit,
 
    GetJavaVM,             //获取当前线程关联的VM


    GetStringRegion,        //获取子串
    GetStringUTFRegion,


    GetPrimitiveArrayCritical,
    ReleasePrimitiveArrayCritical,


    GetStringCritical,        // Get/ReleaseStringCritical必须成对出现,语义和Get/ReleaseStringChars一样,但代码段中不能阻塞当前线程,也不能调用任何其他的JNI函数
    ReleaseStringCritical,   


    NewWeakGlobalRef,
    DeleteWeakGlobalRef,


    ExceptionCheck,        //判断是否有挂起的异常


    NewDirectByteBuffer,
    GetDirectBufferAddress,
    GetDirectBufferCapacity
};


摘自http://www.2cto.com/kf/201203/123043.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中,当Fragment需要调用JNI接口函数时,可以通过以下步骤实现: 1. 首先,在Java中创建一个JNI接口类并使用static类型,以便在不同的Fragment中简便地调用JNI函数。 2. 在JNI接口类中,定义所需的JNI函数,并使用native关键字标记这些函数,表示它们将在C / C++中实现。 3. 在C / C++中,实现JNI函数的功能。可以使用CMakeLists文件来配置和构建通过JNI调用的C / C++代码。 4. 在Java中,通过调用JNI接口类的静态方法来调用JNI函数。根据具体的需求,可以传递参数给JNI函数,并将其结果返回到Java中。 5. 在Fragment中,根据需要处理JNI函数的返回结果,并进行相应的操作。例如,可以将返回的byte数组转换为String类型,并在界面上显示相应的数据。 通过以上步骤,Android Fragment可以成功调用JNI接口函数,并实现与C / C++代码的交互。这样可以在APP开发中使用JNI调用C / C的基本架构,并为开发者提供有益的参考借鉴。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [《“透视”个人大数据》项目开发小记 --(三)Android APP 开发(3)使用jni调用c++/c 应用实例浅析](https://blog.csdn.net/m0_69502339/article/details/127995223)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [自己平时做的android相关的总结](https://download.csdn.net/download/mars_cheng/8724303)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值