-
-
[求助]java层的native静态函数,在so中调用原函数写法
-
发表于: 2023-7-9 20:02 4421
-
现在的问题是,每每运行到这一句:
jstring result = (jstring)env->CallStaticObjectMethod(clazz, methodID, str);
,就会报错,而且调用原始函数是不成功的:
就会报错,当然了,我是单独编译的一个so文件,然后用MT管理器添加到apk中签名安装的。所以能看到错误信息,是在用frida打印日志的时候:Process crashed: Bad access due to protection failure *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** Build fingerprint: 'google/sailfish/sailfish:9/PQ3A.190801.002/5670241:user/release-keys' Revision: '0' ABI: 'arm' pid: 11282, tid: 11282, name: x.xxxx >>> xxx.xxxx <<< signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0xea6ae79c r0 ee193480 r1 ffbb3dcc r2 ffbb3dd0 r3 ea6ae79c r4 ea6ae79c r5 00000000 r6 00000000 r7 ffbb3db8 r8 00000000 r9 ee190000 r10 00000000 r11 ffbb3e54 ip 0000003b sp ffbb3da0 lr d42d6833 pc ea6ae79c
java层的函数定义:
public static native String xxx(String str); 假设函数在a.so中。 我在b.so中写代码: jstring my_xxx(JNIEnv *env, jclass clazz, jstring str) { jmethodID methodID = env->GetStaticMethodID(clazz, "xxx", "(Ljava/lang/String;)Ljava/lang/String;"); jstring result = (jstring)env->CallStaticObjectMethod(clazz, methodID, str); return result; } JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { JNIEnv *env; if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) { return JNI_ERR; } // 获取类引用 char classA[10] = {"com/abc/A"}; jclass clazzA = env->FindClass((const char*)classA); if (clazzA == nullptr) { return JNI_ERR; } static const JNINativeMethod gMethodsA[] = { { "xxx", "(Ljava/lang/String;)Ljava/lang/String;", (void*)my_xxx } }; if (env->RegisterNatives(clazzA, gMethodsA, sizeof(gMethodsA) / sizeof(JNINativeMethod)) < 0) { return JNI_ERR; } return JNI_VERSION_1_6; }
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2023-7-9 20:05
被flashgg编辑
,原因:
赞赏
他的文章
看原图
赞赏
雪币:
留言: