Ami*_*mir 5 c++ java java-native-interface android android-ndk
我想知道是否出于Dex方法计数限制的目的在Dex文件方法计数中计算了用本机C ++编写的方法。
如果是,如果添加了1个本机方法,则将多少方法添加到Dex计数中?
Java方法会增加多少个方法,因为我制作的每个版本中似乎都没有一个可靠的数字...
要获得答案,我们应该浏览.Dex 格式。在我们的例子中,最有趣的部分是一个method_ids数组:
方法标识符列表。这些是该文件引用的所有方法的标识符,无论是否在文件中定义。该列表必须进行排序,其中定义类型(按
type_id索引)是主要顺序,方法名称(按string_id索引)是中间顺序,方法原型(按proto_id索引)是次要顺序。该列表不得包含任何重复的条目。
尽管数组记录数存储为 32 位无符号整数(请参阅method_ids_size字段),但实际上该数组最多只能包含65536条目。这是因为dex 指令method_id的操作数invoke-xxxx是 16 位实体,并且必须是method_ids. 结果记录的索引更大,65535字节码无法访问。所有这些都会导致众所周知的“64K 方法”问题。
因此,正如文档所说 -method_ids每个方法定义的每个方法dex以及外部方法都有一个记录,由定义方法的代码引用。
因此,每次添加如下代码:
public native void foo();
Run Code Online (Sandbox Code Playgroud)
到您的一门课程 - 您将获得一份额外的记录method_ids。对于方法的声明也是如此abstract。然后,每次添加一些常规方法的实现,例如:
public void baz() {
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
您将获得其自身的一条新记录baz()以及被引用baz()但尚未添加的所有方法的记录method_ids。
本机代码对内容完全没有影响dex,因为所有 C/C++ 源代码都编译成机器代码,并通过文件分发.so。这些使用 ELF 格式,有其自身的局限性,并且完全独立于 DEX。
| 归档时间: |
|
| 查看次数: |
290 次 |
| 最近记录: |