C++学习(四七三)jni调用java方法
Posted hankern
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++学习(四七三)jni调用java方法相关的知识,希望对你有一定的参考价值。
1、方法签名
在app\\build\\intermediates\\classes\\debug的路径下,运行javap -s yys.com.myjnidemo.JniDataUtil,就会输出如下的方法签名描述:
public class yys.com.myjnidemo.JniDataUtil
public yys.com.myjnidemo.JniDataUtil();
descriptor: ()V
public static native java.lang.String getStringFromJni();
descriptor: ()Ljava/lang/String; //括号里面为空,表示参数为空;返回值是String类型
public static native java.lang.String getStringFromJni(int);
descriptor: (I)Ljava/lang/String; //参数是int;返回是String类型
public native void doSomeThings();
descriptor: ()V //参数为空;返回都是void类型
public native void doSomeThings(java.lang.String);
descriptor: (Ljava/lang/String;)V
Java 类型 类型签名
void V
boolean Z
byte B
char C
short S
int I
long L
float F
double D
类 L全限定名;,比如String, 其签名为Ljava/lang/String;
数组 [类型签名, 比如 [B
2、jni调用java静态方法
JNIEXPORT void JNICALL Java_yys_com_myjnidemo_JniDataUtil_doSomeThings__
(JNIEnv * env, jobject obj)
/**
*找到要调用的类
*/
jclass cls_util = env->FindClass("yys/com/myjnidemo/JniDataUtil"); //注意,这里的使用的斜杠而不是点
if(cls_util == NULL)
return;
/**
*获取静态方法操作的对象 ,参数分别是 jclass,方法名称,方法签名
*/
jmethodID mtd_static_method = env->GetStaticMethodID(cls_util,"callStaticHandle","(Ljava/lang/String;)V");
if(mtd_static_method == NULL)
return;
jstring data = env->NewStringUTF("call static method");
if(data == NULL)
return;
/**
*调用方法,参数是 jclass,jmethodID,传递的参数
*/
env->CallStaticVoidMethod(cls_util,mtd_static_method,data);
//删除引用
env->DeleteLocalRef(cls_util);
env->DeleteLocalRef(mtd_static_method);
env->DeleteLocalRef(data);
3、jni调用java实例方法
/**
*找到要调用的类
*/
jclass cls_util = env->FindClass("yys/com/myjnidemo/JniDataUtil"); //注意,这里的使用的斜杠而不是点
if(cls_util == NULL)
return;
/**
*获取实例方法操作的对象 ,参数分别是 jclass,方法名称,方法签名
*/
jmethodID mtd_method = env->GetMethodID(cls_util,"callInstanceHandle","([I)V");
if(mtd_method == NULL)
return;
/**
*获取构造方法
*/
jmethodID mtd_struct = env->GetMethodID(cls_util,"<init>","()V");
if(mtd_struct == NULL)
return;
/**
*获取实例对象
*/
jobject utilinstance = env->NewObject(cls_util,mtd_struct,NULL);
jstring data = env->NewStringUTF("call instance method");
if(data == NULL)
return;
/**
*调用实例方法
*/
env->CallVoidMethod(utilinstance,mtd_method,data);
//删除引用
env->DeleteLocalRef(cls_util);
env->DeleteLocalRef(mtd_method);
env->DeleteLocalRef(mtd_struct);
env->DeleteLocalRef(utilinstance);
env->DeleteLocalRef(data);
以上是关于C++学习(四七三)jni调用java方法的主要内容,如果未能解决你的问题,请参考以下文章
C++学习(二七三)undefined reference to `stderr‘