首页
社区
课程
招聘
[求助]java层的native静态函数,在so中调用原函数写法
发表于: 2023-7-9 20:02 4410

[求助]java层的native静态函数,在so中调用原函数写法

2023-7-9 20:02
4410

现在的问题是,每每运行到这一句:

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编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//