android RPC通过JNI 反向调用java方法

zhouhuajin 2021-02-20 12:36:54
大佬们帮忙看看 哪里代码出了问题

#include <jni.h>
#include <android/log.h>

#define TAG "xc"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG, __VA_ARGS__)

JavaVM *javaVm;//全局JVM
JNIEnv *jniEnv;//全局ENV
jclass globalClass1;//全局Jclass1
jclass globalClass2;//全局Jclass2
jclass jclass1;//全局Jclass1
jclass jclass2;//全局Jclass2
jmethodID jmid1;//全局方法1
jmethodID jmid2;//全局方法1


//方法1 提供给RPC调用 出错
void TestFun1(char* Message) {
LOGD("TestFun1");
if (javaVm != NULL){
LOGD("TestFun1 获取JVM成功");
}

if (globalClass1 != NULL){
LOGD("TestFun1 class获取成功");
}

if (jmid1 != NULL){
LOGD("TestFun1 jmid1获取成功");
}

int status = (*javaVm)->AttachCurrentThread(javaVm,&jniEnv,NULL);
LOGD("TestFun1获取JNIENV");
if (status = JNI_OK) {
LOGD("TestFun1获取env成功");
jstring str = (*jniEnv)->NewStringUTF(jniEnv,"Testfun1呼叫");
(*jniEnv)->CallStaticVoidMethod(jniEnv,globalClass1,jmid1,str);
}
}



//初始化成功
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
LOGD("JNI_OnLoad 加载");
javaVm = vm;
LOGD("JNI_OnLoadvm 获取完成");
int status = (*vm)->GetEnv(vm, (void **) &jniEnv, JNI_VERSION_1_6);
if (status == JNI_OK)
{
LOGD("JNI_OnLoad 获取env成功");
jclass1 = (*jniEnv)->FindClass(jniEnv,"com/zidong/sotest/MainActivity");
globalClass1=(jclass)(*jniEnv)->NewGlobalRef(jniEnv,jclass1);
jmid1 = (*jniEnv)->GetStaticMethodID(jniEnv,jclass1, "showmessage1", "(Ljava/lang/String;)V");
if (globalClass1 != NULL){
LOGD("JNI_OnLoad class获取成功");
}

if (jmid1 != NULL){
LOGD("JNI_OnLoad jmid1获取成功");
}
//失败
TestFun1("初始化测试调用");
}
return JNI_VERSION_1_6;
}

void JNI_OnUnload(JavaVM* vm, void* reserved) {
LOGD("JNI卸载");
}

...全文
179 2 打赏 收藏 举报
写回复
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
不会写代码的猴子 版主 2021-02-20
java层有的,jni基本都有,为何要反射调java接口呢?
  • 打赏
  • 举报
回复
zhouhuajin 2021-02-20
需要调用一些JAVA层的函数
  • 打赏
  • 举报
回复
发帖
Android

7.9w+

社区成员

移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
帖子事件
创建了帖子
2021-02-20 12:36
社区公告
暂无公告