android jni 调用java类方法和成员变量

目录

         jni层的2个变量介绍。

jni调用java层对象和方法

获取上层java的类。

调用java层方法

调用java成员变量

参数 const char* sig


jni层的2个变量介绍。

JNIENV *env,这个是java jni的接口环境,通过它来和上层和c层打交道。 

jobject instance 这个变量就是jni 函数所在上层调用此函数的类的对象。

jni调用java层对象和方法

  • 获取上层java的类。

jclass jclass = env->FindClass("com/example/lammyopenglffmpegvideoplayer/LammyOpenglVideoPlayerView");

此种方式可以获得任意类。

jclass jclass = env->GetObjectClass(instance);

这种方式简单,用的也比较多,直接获取传下来对象的类。

调用java层方法

1、静态方法

静态方法只需要类,不需要具体对象

jclass jclass = env->FindClass("com/example/lammyopenglffmpegvideoplayer/LammyOpenglVideoPlayerView");   
//    jclass jclass = env->GetObjectClass(instance);
jmethodID testMethod_id= env->GetStaticMethodID(jclass,"testMethod","()V");
// 执行
env->CallStaticVoidMethod(jclass, testMethod_id);

2、非静态方法

jni传下来的对象

 jmethodID updateFrame_id= env->GetMethodID(jclass,"updateFrame","()V"); 
// 执行
 env->CallVoidMethod(instance, updateFrame_id);

非jni传下来的对象时候:

 jclass jclass = env->FindClass("com/example/lammyopenglffmpegvideoplayer/LammyOpenglVideoPlayerView");

    jmethodID method_id =env->GetMethodID(jclass, "updateFrame","()V");
// 创建java对象
    jobject new_object = env->NewObject(jclass, method_id);
    jmethodID updateFrame_id= env->GetMethodID(jclass,"updateFrame","()V");
    jmethodID testMethod_id= env->GetStaticMethodID(jclass,"testMethod","()V");
    env->CallVoidMethod(new_object , callback);
    env->CallStaticVoidMethod(jclass, testMethod_id);
  • 调用java成员变量

1、静态成员变量

 jfieldID static_test_id = env->GetStaticFieldID(jclass,"test2","I");
//获得值
  int testStaticV = env->GetStaticIntField(jclass,static_test_id);
// 设置值
env->SetStaticIntField(jclass,static_test_id,230);

2、非静态成员变量

jfieldID test_id = env->GetFieldID(jclass,"test","I");
// 获得值
int testV = env->GetIntField(instance,test_id);
// 设置值
 env->SetIntField(instance,test_id,250);

参数 const char* sig

上面的方法的签名 和 成员的数据类型,签名如下:(javap -s -p 可以查看签名)

类型 签名
boolean Z
byte B
char C
short S
int I
long J
float F
double D
void V
object    L用/分隔包的完整类名;如: Ljava/lang/String
Array [签名 [I(获取int类型的数组) [Ljava/lang/object(获取object的数组);

函数有参数时候,签名格式:
Method (参数1类型签名 参数2类型签名...)返回值类型签名:如 long test(int a) , 则签名  (I)J

当然调用的时候,也要加入 参数: env->CallLongMethod(newNativeUtils, test_id, 32);

关于在非jni函数调用java类和函数,请参考: android 非jni函数调用java类方法

你可能感兴趣的:(android)