将敏感值隐藏在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数组按照以下方式封装进JNI
的C++
部分代码中
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的编写,恳请大神赐教。