2012-10-13 191 views
0

根据Java规则,令人惊叹的发现:Android上的JNI 您是not supposed toAndroid JNI是否可以封装封装?

此功能可绕过任何地方记录的访问限制吗?这是官方的JNI行为还是特定于JNI的Android风格?这是一个未定义的行为? OOP警察现在是否会随时来我身边?

据我所知,依靠未发布的对象字段本质上是危险的,并可能随时打破;这不是问题。

+1

你知道,你可以在没有JNI的帮助下做同样的事情吗?只需使用反射来设置/获取对象中的私有字段:http://stackoverflow.com/questions/1196192/how-do-i-read-a-private-field-in-java –

+0

是的,这在Java中是正常的,但是如果你需要这样的安全级别,我们可以用'SecurityManager'来阻止这样的事情。 –

+0

@SamuelAudet'SecurityManager'块是否也打破了JNI层的封装? – yohjp

回答

0

令人惊叹的发现:Android上的JNI允许您访问根据Java规则不应该存在的对象字段。

缩写JNI不会出现在the question and answers that you linked to的任何地方,除非是作为这个问题的动态生成链接。

这是否记录在任何地方?

什么像样的书在Java开发应涵盖publicprivate

这是一个官方的JNI的行为或Android的具体情况?

都没有。

什么特定Android是编译时的措施,让你很难在一些androidjava,并且javax包添加代码。

这是一个未定义的行为?

这取决于你绑定什么样的基本名词或概念来绑定到代名词“this”。

如果“this”是“访问私人或其他东西”,那么行为不是未定义的。

如果“this”是“访问Android框架中的某些特定私人内容”,那么未定义。有许多Android版本,以及许多版本的框架类。他们的内部实现不完全相同。通过Android SDK不会暴露任何事情都是有资格获得谷歌的变化,设备制造商,ROM国防部维护等

+0

这里和链接问题标签中的[android-ndk]清楚地指向了JNI。通过“这个”我的意思是“成功访问另一个包中另一个无关类的本地方法的类的私有或包私有文件”。我会为后人编辑问题。 –

+0

@SevaAlekseyev:FWIW,在你的链接和我在开篇中引用的问题(“访问Java中的包 - 专用字段”)中没有'android-ndk'标记。 *链接到另一个问题的* android * ndk标签(“NDK中的共享内存区域”),但这不是我引用的那个,而不是您发现此Java功能的那个。我对引用的混淆表示歉意。 – CommonsWare

+0

不,我已经发现了第一个功能。第二个是我确定我不应该能够这样做,无论是通过JNI还是通过Java :) –

1

的问题进行了说明,甚至在2006年

注发布回的article, or rather proposal解决该JAVS定义了SecurityManager类,但它将所有JNI调用视为security breach,因此从他们的角度来看,您的问题不是问题,如询问"why can I get elevation to Administrator when I only install some driver/service?"

但是在Android上,事情更加明确。官方文件describes this class具有以下前言:

传统安全代码;不使用。

安全管理员做不是为执行不受信任的代码提供了一个安全的环境。不可信的代码不能在Dalvik虚拟机内安全隔离。

强调的是他们的

如果您正在寻找保证访问来自JNI本地字段和方法不会消失在Android中,好运的下一个版本更强的话您。另一方面,Android的某些未来版本将更改某些私有字段和方法的名称或签名的可能性较高。此外,他们可以改变执行情况,以使该字段保持不变,但必须以不同的方式使用。

最后请注意,所有这些因素不仅适用于私人或包私人方法,也公共方法和字段未使其进入官方文档!

+0

Tx。就我而言,相关内容在SDK的更高版本(12+)中明确公开。 –