JNI中调用JAVA各种方法详解

总结一下 C 如何 通过 JNI 层调用 Java 的静态和非静态方法

对于:JNIEXPORT void JNICALL Java_com_example_TestNative_sayHello(JNIEnv * env, jobject thiz, jstring paramString)这样一个函数
固定参数:
JNIEnv *env:JNIEnv代表java环境,通过*env这个指针,就可以让我们对java层的代码进行操作,比如创建java类的对象,调用java对象的方法,获取java对象的属性等等
这个指针会被JNI传递到本地方法的实现函数中来对java端的代码进行操作。
jobject thiz:分配给这个类的类加载器
函数参数:
jstring paramString:这是sayHello函数的具体参数,在外部调用的时候必须给sayHello函数一个参数,如:sayHello(“Hello JNI”);
调用java过程中(重点是调用java中的某些类的某些方法)
主要分下面几个步骤:
1.获取jclass
JNIEnv类中有如下几个简单的函数可以取得jclass
     jclass FindClass(const char* clsName)  根据类名来查找一个类,完整类名
    jclass GetObjectClass(jobject obj)   根据一个对象,获取该对象的类
    jclass GetSuperClass(jclass obj)     获取一个类的父类
FindClass:根据类名来查找,需要注意的是:这里的类名是某个类的完整路径。
如:String这个类    jclass cls_string= (*env)->FindClass(“java/lang/String”);
在用的时候 需要把 . 换成 / 
2.获取类中方法的ID或类属性的ID
JNI在jni.h头文件中定义了 jmethodID和 jfieldID类表示Java端的方法和属性
JNIEnv获取相应的jmethodID和 fieldID 的方法:
GetMethodID/GetStaticMethodID   获取一个实例的方法ID/一个静态的方法ID
GetFieldID/GetStaticMethodID         获取一个实例的域的ID/一个静态的域的ID
GetMethodID原型:
jmethodID (JNICALL *GetMethodID)
      (JNIEnv *env, jclass clazz, const char *name, const char *sig);
第一个参数默认的*env
第二个参数是获取到的类
第三个参数是你要获取的某一个方法的名字
第四个参数是“签名”,引用这个签名的作用是对这一函数参数和返回值的描述,对于同一个函数,java是允许对它进行重载的,这时候就必须引入签名来区分他们
3.调用方法
JNI同样提供了调用java方法的函数
JNIEnv去调用相应java方法的方法有:
Call<type>Method/CallStatic<type>Method  这里的<type>是要调用的那个方法的返回值类型
大致有
CallVoidMethod                   CallStaticVoidMethod
CallIntMethod                     CallStaticIntMethod
CallBooleanMethod              CallStaticBooleanMethod
CallByteMethod                   CallStaticByteMethod
如:(*env)->CallVoidMethod(env, obj, jm_id,  parameter);
参数一 默认的*env
参数二是获取到的类
参数三是要调用的方法的ID
参数四这一方法的参数
方法的签名:
形如:(参数1类型签名参数2类型签名……参数n类型签名)返回值类型签名
签名分两部分:参数 & 返回值
类型的表述方式有如下对应关系:

 

注:
1.object类型的每一个参数最后都得加上”;“
2.方法参数或者返回值为java中的对象时,签名中必须以“L”加上其路径,不过此路径必须以“/”分开,自定义的对象也使用本规则
例如说 java.lang.String为“java/lang/String”,com.nedu.jni.helloword.Student为”Lcom /nedu/jni/helloword/Student;”
3.方法参数或者返回值为数组类型时,请前加上[
例如[I表示 int[],[[[D表示 double[][][],即几维数组就加几个[
实例:
下面以几个实例来重点介绍下方法的签名的书写方式
a、调用某一个类的构造函数:

 

b、调用String类的getBytes方法:

 

c、调用Cipher类的 getInstance方法:

 

实例一:

 

实例二

 

 

 

本文出自 0n1y3nd's Blog,转载时请注明出处及相应链接。

本文永久链接: http://0nly3nd.sinaapp.com/?p=277

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值