JNI学习笔记三

访问java类中的属性和方法
jfileID 属性
jmethodID 方法


JNIEnv 的函数
GetFieldID
GetStaticFieldID
GetMethodID
GetStaticMethodID
示例代码
env_>GetMethodID(data_Clazz,"<int>","()V")





整体实例方法

java 代码
public class TestNative{
public void function(int i){
System.out.printfln("integer:"+i);
}


public void function(double d){
System.out.println("double:"+d);
}
}


在c/c++代码中调用function方法
// 首先取得testNative类
jclass clazz_TestNative =env_>FindClass("cn/yue/TestNative");
// 取得methodID
//最后一个参数 sign
如果指定为"(I)V" 则取function(int i)方法的id
如果指定为"(D)V" 则取function(double d)方法的id
jmethodID id_func=env->GetMethodID(clazz_TestNative,"function","");

类型对应签名



boolean z
byte b
char c
short s
int i
long l
float f
double d
void v
object L用/分鬲完整类名; Ljava/lang/String;
Array [签名 [I
Method (参数1类型签名,参数2签名)返回值类型的签名





命令javap可以生成
javap -s -private 类的全路径(bin目录下)




取得java类中的属性值
//取得java类中的属性
jclass clazz_TestNative=env->GetObjectClass(obj);
jfieldID id_number=env->GetFieldID(clazz_TestNative,"number","I");
jint number=env->GetIntField(obj,id_number);
cout<<number<<endl;
env->SetIntField(obj,id_number,100);
取得java类中的方法
调用实例方法的三种形式:
1 Call<TYPE> Method(Jobject obj,jmethodID id);
方法一:
如果java 中方法为
boolean function(int i,double d,char c){}
本地方法的代码为:
env->CallBooleanMethod(obj,id_function,100L,3.44,L'3');
2 Call<TYPE> MethodV(jobject obj,jmethodID id,va_list lst);
//jvalue 是一种联合体类型
3 Call<TYPE> MethodA(jobject obj,jmethodID id,jvalue * v );
示例代码:
jvalue * args=new jvalue[3];
args[0].i=100L;
args[1].d=3.44;
args[3].c=L'3';
env->CallBooleanMethodA(obj,id_function,args);
delete[] args;


调用静态方法
1 CallStatic <TYPE> Method(Jobject obj,jmethodID id);
2 CallStatic <TYPE> MethodV(jobject obj,jmethodID id,va_list lst);
//jvalue 是一种联合体类型
3 CallStatic <TYPE> MethodA(jobject obj,jmethodID id,jvalue * v );


子类调用父类中的方法
java代码如下:
public class Father {
public void function() {
System.out.println("Father:function");
}
}


public class Child extends Father {


@Override
public void function() {
System.out.println("Child: function");
}
}

入口函数中定放如下属性
public Father p=new Child();


//本地方法实现


jfieldID id_p=env->GetFieldID(clazz_TestNative,"p","Lcn/yue/jni/Father;");
jobject p=env->GetObjectField(obj,id_p);


jclass clazz_Father=env->FindClass("cn/yue/jni/Father");
jmethodID id_father_function=env->GetMethodID(clazz_Father,"function","()V");
//调用子类的方法
//env->CallVoidMethod(p,id_father_function);


//调用父类的方法:
env->CallNonvirtualVoidMethod(p,clazz_Father,id_father_function);

env->CallNonvirtualVoidMethod(p,clazz_Father,id_father_function);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值