Android C++中调用java

转自:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=114461


都知道java需要 obj var = new obj();这样一个过程,我们在C++中调用java类的成员函数,当然也要先示例话一个类。

  示例化的函数如下所示

  jobject getInstance(JNIEnv* env, jclass obj_class)
  {
  jmethodID construction_id = env->GetMethodID(obj_class, "<init>", "()V");
  jobject obj = env->NewObject(obj_class, construction_id);
  return obj;
  }
  这个函数中的env表示环境参数,jclass表示一个java类的句柄。
  jmethodID construction_id = env->GetMethodID(obj_class, "<init>", "()V");
  GetMethodID的参数分别为(类句柄,方法名称,参数名称)

  这个是为了获取java类中某个方法的句柄,有一点需要特别注意的,在获取构造方法的句柄和别的方法的句柄是不一样的。

  获取一般方法的句柄所填写“方法名称”参数直接就是这个方法的名称,而构造函数的话就必须填写"<init>"。除了这点区别外,就没有区别了。

       比如我们要找个int func(double)类型的函数,就该这么写:
  jmethodID construction_id = env->GetMethodID(obj_class, " func ", "(D)I");
  找到了构造函数的方法之后我们直接调用构造函数,然后把生成的类返回即可
  jobject obj = env->NewObject(obj_class, construction_id);
  其中obj_class为类的句柄construction_id为构造函数的句柄,而类的实例被该函数返回。
  调用java类的其他函数

java代码:

  1. JNIEXPORT jstring JNICALL Java_com_hm_hello_CActivityMain_stringFromJNI(JNIEnv* env, jobject)
  2. {
  3. jstring str;
  4. jclass java_class = env->FindClass("com/hm/hello/CForCall");
  5. if (java_class == 0){

  6. return env->NewStringUTF("not find class!");

  7. }

  8. jobject java_obj = getInstance(env, java_class);

  9. if (java_obj == 0){
  10. return env->NewStringUTF("not find java OBJ!");
  11. }

  12. jmethodID java_method = env->GetMethodID(java_class, "GetJavaString", "()Ljava/lang/String;");

  13. if(java_method == 0){
  14. return env->NewStringUTF("not find java method!");
  15. }
  16. str = (jstring)env->CallObjectMethod(java_obj, java_method);
  17. return str;
  18. }
复制代码

       看完了构造函数的介绍,这段代码其实很容易就看懂了,我们发现调用java中的函数的步骤无非几步:
  1找到类句柄
  2找到类的方法的句柄
  3实例化类
  4调用实例化类的方法.
  而以上代码中只有一段没说过,就是
  jclass java_class = env->FindClass("com/hm/hello/CForCall");
  看名字就知道,是在找相应的类的句柄,其中com.hm.hello准备调用类的完整包名(把.转换为/),而CforCall就是我们要调用的类的名称.


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值