Java2C常见问题

针对DEX文件保护之Java2C方案的问题说明

1. 不支持lambda表达式

因为目前Java2C方案是基于java7研发,所以暂时不支持lambda表达式

2. 单个函数for循环过多或嵌套缺陷问题

如果出现类似崩溃问题【如下图】减少单个函数中循环结构的个数和循环嵌套的次数,按照示例代码中拆分方式修改,或过滤掉该函数

JNI ERROR (app bug): accessed stale local reference 0x145 (index 81 in a table of size 81)

1-1

以下代码中的for循环内部包含外层传递的Object对象类型,需要进行抽离处理。int、long等类型则可以正常使用

//原始代码
public void demo() {
    int x = 100;
    String data = new String();
    for (int i = 0; i < 100; i++) {
        Log.d("a", "b" + data);
    }
    for (int i = 0; i < 100; i++) {
        Log.d("a", "b" + data);
    }
    for (int i = 0; i < 100; i++) {
        for (int j = 0; j < i; j++) {
            Log.d("a", "b" + data);
        }
        Log.d("a", "b" + data);
    }
}
//抽离后的代码
public void demo0(String data) {
    for (int i = 0; i < 100; i++) {
        Log.d("a", "b" + data);
    }
}
public void demo1(String data, int i) {
    for (int j = 0; j < i; j++) {
        Log.d("a", "b" + data);
    }
}
public void demo_() {
    int x = 100;
    String data = new String();
    demo0(data);
    for (int i = 0; i < 100; i++) {
        Log.d("a", "b" + data);
    }
    for (int i = 0; i < 100; i++) {
        demo1(data, i);
        Log.d("a", "b" + data);
    }
}

3. 异常处理无法转换

Java相关的虚拟机内部异常,与Jni内部的Cpp异常不相同,暂时无法转换

4. 上层函数传入空指针会导致崩溃

理论上原始代码也会崩溃,没有做异常处理,部分原始的字符串拼接不会崩溃,转换之后的native会崩溃

5. 异常处理不能为空

try {
  localSemaphore.acquire();
} catch (InterruptedException localInterruptedException) {
    //这里非议异常处理的catch不能为空
}

6. 参数加标签有意义的无法处理

a(@NoNNull b)这种可以处理

7. 下划线"_"特殊符号不支持

类名或函数名中包含“_”符号的情况,暂不支持Java2C转化,如需加密此类函数,请修改类名或函数名

results matching ""

    No results matching ""