android+jni+构造函数,Android JNI开发系列(十一) JNI 访问父类的构造方法和父类实例方法...

实现文件 // // Created by Peng Cai on 2018/10/16. //

# include "include/call_super.h"

# include

# include

# include

JNIEXPORT void JNICALL Java_org_professor_jni_MainActivity_callNativeSuperInstanceMethod(JNIEnv *env, jobject instance) {

//1. 获取类类型

jclass birdClazz = (*env)->FindClass(env, "org/professor/jni/animal/Bird");

if (NULL == birdClazz) {

__android_log_print(ANDROID_LOG_WARN, "ANIMAL", "Create Bird Class Failed");

return;

}

//2.获取构造函数ID 构造方法的名统一为:

jmethodID birdInstanceMethodId = (*env)->GetMethodID(env, birdClazz, "",

"(Ljava/long/String;)V");

if (NULL == birdInstanceMethodId) {

__android_log_print(ANDROID_LOG_WARN, "ANIMAL", "Create Bird Instance Method Id Failed");

return;

}

//3. 创建一个对象实例

jstring name = (*env)->NewStringUTF(env, "YIMI");

if (NULL == name) {

//有可能内存不够

__android_log_print(ANDROID_LOG_WARN, "ANIMAL", "Create Bird Name Failed");

return;

}

jobject birdObj = (*env)->NewObject(env, birdClazz, birdInstanceMethodId, name);

if (NULL == birdObj) {

__android_log_print(ANDROID_LOG_WARN, "ANIMAL", "Create Bird Instance Obj Failed");

return;

}

// 4.获取调用方法ID

jmethodID birdGetNameMethodID = (*env)->GetMethodID(env, birdClazz, "getName",

"()Ljava/long/String;");

if (NULL == birdGetNameMethodID) {

__android_log_print(ANDROID_LOG_WARN, "ANIMAL", "Create Bird Get Name Method Id Failed");

return;

}

//5. 调用自己getName方法

jstring birdName = (*env)->CallObjectMethod(env, birdObj, birdGetNameMethodID);

if (NULL != birdName) {

const char *c_bird_name = (*env)->GetStringUTFChars(env, birdName,

JNI_FALSE); //转换编码格式 在C里面用 JNI_FALSE代表不拷贝到缓冲区

if (NULL != c_bird_name) {

__android_log_print(ANDROID_LOG_WARN, "ANIMAL bird name = %s", c_bird_name);

//释放从java层获取到的字符串所分配的内存

(*env)->ReleaseStringUTFChars(env, birdName, c_bird_name);

}

}

//-------华丽分割线--------------

//6. 获取父类的Clazz

jclass animalClazz = (*env)->FindClass(env, "org/professor/jni/Animal");

if (NULL == animalClazz) {

__android_log_print(ANDROID_LOG_WARN, "ANIMAL", "Create Animal Class Failed");

return;

}

//7.获取父类方法ID eat方法

jmethodID animalEatMethodID = (*env)->GetMethodID(env, animalClazz, "eat", "()V");

if (NULL == animalEatMethodID) {

__android_log_print(ANDROID_LOG_WARN, "ANIMAL", "Create Animal Eat Method Id Failed");

return;

}

//8.子类调用父类方法 eat

//注意:birdObj是Bird的实例,animalClazz是Animal的Class引用,animalEatMethodID是Animal类中的方法ID

(*env)->CallNonvirtualVoidMethod(env, birdObj, animalClazz, animalEatMethodID);

//--------------华丽分割线------------------

// 9.获取父类调用方法getName

jmethodID animalGetNameMethodID = (*env)->GetMethodID(env, animalClazz, "getName",

"()Ljava/long/String;");

if (NULL == animalGetNameMethodID) {

__android_log_print(ANDROID_LOG_WARN, "ANIMAL", "Create Animal Get Name Method Id Failed");

return;

}

//10.子类调用父类GetName 方法

jstring animalName = (*env)->CallNonvirtualObjectMethod(env, birdObj, animalClazz,

animalGetNameMethodID);

if (NULL != animalName) {

const char *c_animal_name = (*env)->GetStringUTFChars(env, animalName, JNI_FALSE);

if (NULL != c_animal_name) {

__android_log_print(ANDROID_LOG_WARN, "ANIMAL animal name = %s",

c_animal_name);

//释放从java层获取到的字符串所分配的内存

(*env)->ReleaseStringUTFChars(env, animalName, c_animal_name);

}

}

quit:

// 删除局部引用变量 jmethod 不是引用类型 (jobject或jobject的子类才属于引用变量)

(*env)->DeleteLocalRef(env, birdClazz);

(*env)->DeleteLocalRef(env, animalClazz);

(*env)->DeleteLocalRef(env, name);

(*env)->DeleteLocalRef(env, birdObj);

(*env)->DeleteLocalRef(env, birdName);

(*env)->DeleteLocalRef(env, animalName);

} ```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值