c call java的实现方式
来源:互联网 发布:wings知乎 编辑:程序博客网 时间:2024/06/02 12:23
近日,我们WifiDisplay的项目中,有需要用到C call Java的代码,我不太能够懂得如何能够实现C call Java,所以我就向我们公司的一帮牛人请教了下,只是简单的写了一个C call Java的实例。
代码:
1.我首先是在java中写了一个调用C层代码的方法,名字叫nativeSetup的方法
public static native void nativeSetup(Object obj);
之后在java中的activity中的onCreate方法中调用它:
nativeSetup(this);
通过这个方法将一个activity的对象传入C层中;
2.在C层中,通过实现nativeSetup(Object),来得到上层Java代码中的对象,从而能够得到methodID,再通过CallStaticMethod方法,调用Java层的方法,具体实现:
static jobject player = NULL;
static JavaVM* gJavaVM = NULL;
extern "C" { JNIEXPORT void JNICALL Java_com_uv_renderer_ProvisionActivity_nativeSetup(JNIEnv *env, jobject obj, jobject param);}JNIEXPORT void JNICALL Java_com_uv_renderer_ProvisionActivity_nativeSetup(JNIEnv *env, jobject obj, jobject param){player = env->NewGlobalRef(param);env->GetJavaVM(&gJavaVM);if (env->ExceptionOccurred()){
return; }if(gJavaVM == NULL) { env->GetJavaVM(&gJavaVM); if (env->ExceptionOccurred()) { return; } }
if (env->ExceptionOccurred()) { return; }
__android_log_print(ANDROID_LOG_INFO, "ProvisionActiity","C : ProvisionActiity : nativeSetup called");
}void callVoidMethod(char* ch){JNIEnv* myEnv = NULL; gJavaVM->AttachCurrentThread(&myEnv, NULL); jclass cls = myEnv->GetObjectClass(player); jmethodID method = myEnv->GetStaticMethodID(cls, "callVoidMethod","(Ljava/lang/String;)V");if (myEnv != NULL && cls != NULL && method != NULL) { __android_log_print(ANDROID_LOG_INFO, "ProvisionActivity","C : ProvisionActivity : callVoidMethod : called begin"); jstring str = toJString(myEnv, ch); myEnv->CallStaticVoidMethod(cls, method, str); if (myEnv->ExceptionOccurred()) { gJavaVM->DetachCurrentThread(); return; } gJavaVM->DetachCurrentThread(); }
__android_log_print(ANDROID_LOG_INFO, "ProvisionActivity","C : ProvisionActivity : callVoidMethod : called end");
}int callIntMethod(){__android_log_print(ANDROID_LOG_INFO, "ProvisionActivityC : ProvisionActivity : callIntMethod : called start"); int intNumber= -1;JNIEnv* myEnv = NULL; gJavaVM->AttachCurrentThread(&myEnv, NULL); jclass cls = myEnv->GetObjectClass(player); jmethodID methodId = myEnv->GetStaticMethodID(cls, "callIntMethod", "()I");
if (myEnv != NULL && cls != NULL && methodId != NULL) { intNumber = myEnv->CallStaticIntMethod(cls, methodId); if (myEnv->ExceptionOccurred()) { gJavaVM->DetachCurrentThread(); return -1; } gJavaVM->DetachCurrentThread();
} __android_log_print(ANDROID_LOG_INFO, "ProvisionActivity","C : ProvisionActivity : callIntMethod : called end"); return intNumber;
}const char* callStringMethod(){__android_log_print(ANDROID_LOG_INFO, "ProvisionActivty","C : ProvisionActivity : callStringMethod : called start"); const char* ch = NULL; JNIEnv* myEnv = NULL; gJavaVM->AttachCurrentThread(&myEnv, NULL); jclass cls = myEnv->GetObjectClass(player);jmethodID methodId = myEnv->GetStaticMethodID(cls, "callStringMethod", "()Ljava/lang/String;"); jstring str =NULL;
if (myEnv != NULL && cls != NULL && methodId != NULL) {
str = (jstring)(myEnv->CallStaticObjectMethod(cls, methodId));
if (str != NULL) ch = myEnv->GetStringUTFChars(str, 0);
if (myEnv->ExceptionOccurred()) { gJavaVM->DetachCurrentThread(); return NULL; } gJavaVM->DetachCurrentThread();
}__android_log_print(ANDROID_LOG_INFO, "ProvisionActivty","C : ProvisionActivity : callStringMethod : called end");return ch;}void callVoidMethod(char* first,char* second){__android_log_print(ANDROID_LOG_INFO, "ProvisionActivty","C : ProvisionActivity : callVoidMethod(char*,char*) : called start");if (player== NULL) { return; } JNIEnv* myEnv = NULL; gJavaVM->AttachCurrentThread(&myEnv, NULL);
jclass cls = myEnv->GetObjectClass(player); jmethodID method = myEnv->GetStaticMethodID(cls, "callVoidMethod","(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;)V"); if (myEnv && cls && method) { jstring jarg1 = myEnv->NewStringUTF((const char*) first); jstring jarg2 = myEnv->NewStringUTF((const char*) second); myEnv->CallStaticVoidMethod(cls, method, player, jarg1, jarg2); if (myEnv->ExceptionOccurred()) { gJavaVM->DetachCurrentThread(); return; } gJavaVM->DetachCurrentThread(); }
__android_log_print(ANDROID_LOG_INFO, "ProvisionActivty","C : ProvisionActivity : callVoidMethod(char*,char*) : called end");}
好了,C call Java的调用就已经结束了。最后再附个将jstring转化为char*的方法:
jstring toJString(JNIEnv* env, char* pat) {__android_log_print(ANDROID_LOG_INFO, "ProvisionActivity","C : ProvisionActivity : toJString called start");jclass strClass = env->FindClass("java/lang/String");jmethodID ctorID = env->GetMethodID(strClass, "<init>","([BLjava/lang/String;)V");jbyteArray bytes = env->NewByteArray(strlen(pat));env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*) pat);jstring encoding = env->NewStringUTF("utf-8");__android_log_print(ANDROID_LOG_INFO, "ProvisionActivity","C : ProvisionActivity : toJString called end");return (jstring) env->NewObject(strClass, ctorID, bytes, encoding);}
- c call java的实现方式
- javascript除call函数外实现继承的方式之一
- javascript使用call方式实现对象继承
- JNI - Call Method(Callback Call java methods from c)
- java实现多线程的方式
- java多线程的实现方式
- java线程的实现方式
- JAVA WebService的实现方式
- Java多态性的实现方式
- Java多线程的实现方式
- Java多线程的实现方式
- java代理的实现方式
- Java线程的实现方式
- java 实现多线程的方式
- Java实现多线程的方式
- Java 实现多线程的方式
- JAVA反射的实现方式
- dump call stack 的实现
- 互联网就是大脑,互联网的7种神经反射弧
- oracle不使用索引快速全扫描或索引全扫描的原因
- Linux中权限对文件与目录的意义何在
- 新老生交流感想
- web 服务器 Boa 移植
- c call java的实现方式
- 别人拿不走的才是你最有价值的
- struts的s标签
- 怎么设计好类?
- Keep ON Learning
- MYSQL官网
- 嵌套事务
- [MacOSX]_[解决电脑不用一会后网络自动断开的问题]
- 网页编码就是那点事