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);
- c代码回调java中的代码
- C代码回调java代码
- C代码回调java方法
- C#中的托管代码
- c代码调用java代码
- JNI之C代码访问java中的成员和java调C
- 内存中的JAVA代码
- Java中的代码块
- JAVA中的代码块
- Java中的代码块
- java中的分页代码
- Java中的log4j代码
- Java中的代码块
- java中的代码块
- Java代码中的常见问题!
- Java中的代码块
- Java中的代码块
- Java中的代码块
- 电脑硬件信息修改大师破解修改版
- 佛祖与蜘蛛的故事
- 大数据计算:如何仅用1.5KB内存为十亿对象计数
- Index Range Scan【每日一译】--20121221
- SIFT特征点匹配与消除错配:BBF,RANSAC
- c代码回调java中的代码
- 使用C查找使用某端口的进程名
- Linux下安装Oracle11g服务器
- LEB(Little Endian Base )128 的编码解码
- 优酷土豆2013校园招聘笔试题
- java基础学习笔记(六) java反射
- get,post字数长度限制
- Clojure编程环境安装
- 网络调试工具