Android native在Debug模式下可以传值(字符串),但是在Release模式下传不回值

敏感值隐藏在native层中以防止反编译时被关键词搜索,我是用这样的方法。

//用来char数组化string,将src换成需要拆散的string
#include <stdio.h>

int main() {
    char src[] = "ab";
    int len = 0;
    while (src[len] != '\0')
        len++;
    printf("\n(char[]){");
    for (int i = 0; i <= len - 1; i++) {
        printf("\'%c\'", src[i]);
        if (i < len - 1)
            printf(",");
    }
    printf(",\'\\0\'}\n");
    return 0;
}

然后将拆散的char数组按照以下方式封装进JNIC++部分代码中

extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_example_MyClass_a(JNIEnv *env, jobject, jint i) {
    //...
    int char_select = (int) i;
    char *retStr = NULL;
    //其实有多个定义
    char *str1 = (char[]) {'a','b','\0'};
    //...
    //switch分支选择对应字串
    switch (char_select) {
        case 0:
            retStr = str1;
            break;
        //...
        
    }
    //返回
    return env->NewStringUTF(retStr);
}

使用(反射一些方法,但是用native层存储相关的名称字段)

public class MyClass extends Application{
    //载入so
    static {
        System.loadLibrary("native");
    }
    
    static native String a(int i);

    private static void x(Context context) {
        try {
            //多次反射操作,但是用native层传值
            Class<?> clz1 = Class.forName(a(1));
            Method mtd1 = clz.getMethod(a(2));
            Object obj1 = mtd1.invoke(context);
            Method mtd2 = clz1.getMethod(a(3));
            String str = (String) mtd2.invoke(context);
            Field fld1 = clz1.getField(a(4));
            //...
        //简化反射相关的异常捕捉    
        } catch (Exception e) {
            e.printStackTrace();
        }
    //在onCreate处调用
    @Override
    public void onCreate() {
        super.onCreate();
        x(this);
        //...
    }
}

然后就发现了一个奇怪的问题,这段代码在Debug模式下工作良好,但是在Release模式下却无法工作,返回的值是空值或者是乱码。这是什么原因?

搜索百度必应谷歌DuckDuckGo无果,我还不是很懂JNI的编写,恳请大神赐教。

阅读 1.4k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题