android退出程序还能向服务器传值吗,Android native在Debug模式下可以传值(字符串),但是在Release模式下传不回值...

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

//用来char数组化string,将src换成需要拆散的string

#include

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的编写,恳请大神赐教。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值