我在Java程序中有两个类。 A类和B类 B类包含一个执行C ++代码的本机函数。
据我所知,C ++代码将在与Java代码相同的过程中运行。
我的问题是如何限制C ++代码访问Java内存并读取A类参数?
答案 0 :(得分:3)
恐怕你运气不好。与反射不同,JNI完全不可测:CallVoidMethod()或GetIntField()可以访问所有内容。
在某种程度上,混淆可以提供帮助。如果A类被混淆,那么其所有字段和方法的人类可读名称就会消失。通常,混淆器会生成稳定,可预测的名称,但通过简单trick,它们可以随机化。 Proguard还可以“优化”您的课程,内联一些方法。不再存在的方法不能通过JNI调用。
但是,领域仍然存在,从“外部”调用的方法仍然存在,甚至可能保留其名称。因此,最好不要将您无法信任的JNI库加载到您的流程中。嗯,任何DLL都是如此。