C调用java代码

主要是利用反射的原理  

C语言回调java方法     java代码开发好了 一个方法  C会掉java代码

javap -s 打印方法的签名  注意要cd到 C:\workspace\HelloWorldFromC2\bin\classes    传全类名 

通过反射 调用java代码 

Class<?> forName = Class.forName("com.example.ndkcallback.DataProvider");
Method declaredMethod = forName.getDeclaredMethod("helloFromJava", new Class[]{});
declaredMethod.invoke(forName.newInstance(), new Object[]{});

///jclass      (*FindClass)(JNIEnv*, const char*);
jclass clazz=(*env)->FindClass(env,"com/example/ndkcallback/DataProvider");  //参数为 env  和  全类名 (需要调用的java方法所在的类)
//  jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);   
// 方法签名  参数和返回值
jmethodID methodId=(*env)->GetMethodID(env,clazz,"helloFromJava","()V");  //参数为  env   jclass   方法名   和方法签名(通过到bin/class目录下  javap -s 全类名) 得到
// void        (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);

(*env)->CallVoidMethod(env,jobject,methodId);   //参数为  env  调用的对象  如果 要调用的java方法 和 native方法 不在一个目录下  那么使用 

                                                                                                jobject     (*AllocObject)(JNIEnv*, jclass);    jobject obj=(*env)->AllocObject(env,clazz);  // new MainActivity();作为参数  

//最后一个参数是 方法 id


//如果调用的是  静态方法  下述  即可  主要是多了个static

JNIEXPORT void JNICALL Java_com_example_ndkcallback_DataProvider_callMethod5
  (JNIEnv * env, jobject j){
jclass clazz=(*env)->FindClass(env,"com/example/ndkcallback/DataProvider");
//     jmethodID   (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);
jmethodID  methodid=(*env)->GetStaticMethodID(env,clazz,"demo","()V");
//void        (*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...);
(*env)->CallStaticVoidMethod(env,clazz,methodid);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值