转自: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就是我们要调用的类的名称.


更多相关文章

  1. Android(安卓)Audio代码分析7 - stream type
  2. [Android]AndroidBucket增加碎片SubLayout功能及AISubLayout的注
  3. Android中SharedPreferences使用方法介绍
  4. android EditText监听事件处理方法
  5. [Android] Android(安卓)sqlite事务
  6. Android(安卓)Http请求方法汇总
  7. lighting sensor 部分分析
  8. Android中触摸事件MotionEvent的来源
  9. Android多线程研究(1)——线程基础及源码剖析

随机推荐

  1. Android(安卓)AES加密算法及事实上现
  2. android dom方式创建xml
  3. Android壁纸的设置
  4. [Android]自定义图片左上角斜着的View
  5. Android(安卓)常用开源框架汇总
  6. Android(安卓)Studio按钮响应事件(一)
  7. Android横竖屏切换
  8. 教你如何开关Android的APN网络
  9. Android中使用WebView, WebChromeClient
  10. Android中Message机制的灵活应用(一)