c代码回调java中的代码

来源:互联网 发布:lnmp源码编译安装 编辑:程序博客网 时间:2024/05/16 11:06

应用场景:

1. 当c代码接受到特定的消息 让c代码通知 java代码

2. c程序员 c代码想复用java里面的函数和方法

 

1、调无惨数的方法:

 //C调用java空方法
 public void helloFromJava(){
  
  System.out.println("hello from java");
 }

JNIEXPORT void JNICALL Java_cn_itcast_ndkcallback_DataProvider_callmethod1
  (JNIEnv * env, jobject obj){
 //在c代码里面调用java代码里面的方法
 // java 反射
    //1 . 找到java代码的 class文件
 //    jclass      (*FindClass)(JNIEnv*, const char*);
 jclass dpclazz = (*env)->FindClass(env,"cn/itcast/ndkcallback/DataProvider");
 if(dpclazz==0){
  LOGI("find class error");
  return;
 }
 LOGI("find class ");

 //2 寻找class里面的方法
 //   jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
 jmethodID method1 = (*env)->GetMethodID(env,dpclazz,"helloFromJava","()V");
 if(method1==0){
  LOGI("find method1 error");
  return;
 }
 LOGI("find method1 ");
 //3 .调用这个方法
 //    void        (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
 (*env)->CallVoidMethod(env,obj,method1);
}

 

2、C调用java中的带两个int参数的方法
 public int Add(int x,int y){
  int result = x+y;
  System.out.println("java result"+ result);
  return result;
 }

  

 // java 反射
    //1 . 找到java代码的 class文件
 //    jclass      (*FindClass)(JNIEnv*, const char*);
 jclass dpclazz = (*env)->FindClass(env,"cn/itcast/ndkcallback/DataProvider");
 if(dpclazz==0){
  LOGI("find class error");
  return;
 }
 LOGI("find class ");

 //2 寻找class里面的方法
 //   jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
 jmethodID method2 = (*env)->GetMethodID(env,dpclazz,"Add","(II)I");
 if(method2==0){
  LOGI("find method2 error");
  return;
 }
 LOGI("find method2 ");
 // 3 调用这个方法
 //    jint        (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);
 int result = (*env)->CallIntMethod(env,obj,method2,3,5);

 

3、C调用java中参数为string的方法

 public void printString(String s){
  System.out.println("java "+ s);
 }

   //1 . 找到java代码的 class文件
  //    jclass      (*FindClass)(JNIEnv*, const char*);
  jclass dpclazz = (*env)->FindClass(env,"cn/itcast/ndkcallback/DataProvider");
  if(dpclazz==0){
   LOGI("find class error");
   return;
  }
  LOGI("find class ");

  //2 寻找class里面的方法
  //   jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
  jmethodID method3 = (*env)->GetMethodID(env,dpclazz,"printString","(Ljava/lang/String;)V");
  if(method3==0){
   LOGI("find method3 error");
   return;
  }
  LOGI("find method3 ");

  //3 .调用这个方法
  //    void        (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
  (*env)->CallVoidMethod(env,obj,method3,(*env)->NewStringUTF(env,"haha in c"));

 

4调静态方法;

 public static void printStaticStr(String s){
  System.out.println("java static"+ s);
 }

  //3.调用一个静态的java方法
  //    void        (*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...);
  (*env)->CallStaticVoidMethod(env,dpclazz,method4,(*env)->NewStringUTF(env,"static haha in c"));

 

5、native代码和调用的java代码不在同一个类里面

 JNIEXPORT void JNICALL Java_cn_itcast_ndkcallback_DemoActivity_call_1dp_1method1
  (JNIEnv * env, jobject obj){

  jclass dpclazz = (*env)->FindClass(env,"cn/itcast/ndkcallback/DataProvider");
  if(dpclazz==0){
   LOGI("find class error");
   return;
  }
  LOGI("find class ");

  //2 寻找class里面的方法
  //   jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
  jmethodID method1 = (*env)->GetMethodID(env,dpclazz,"helloFromJava","()V");
  if(method1==0){
   LOGI("find method1 error");
   return;
  }
  LOGI("find method1 ");
  //3 .调用这个方法
  //    void        (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
  //    jobject     (*NewObject)(JNIEnv*, jclass, jmethodID, ...);
  //  jobject     (*AllocObject)(JNIEnv*, jclass);
  jobject dpobj= (*env)->AllocObject(env,dpclazz); //new 一个对象 而不是用传过来的jobject obj

  (*env)->CallVoidMethod(env,dpobj,method1);

 

 

原创粉丝点击