是在DEX文件方法计数中计数的本机C 方法
Are native C++ methods counted in dex file method count?
我想知道为了dex方法计数限制,在dex文件方法中计数本机中写入的方法是否计数。
如果是,如果添加了1种本机方法,则将多少方法添加到DEX计数中?
java方法添加了多少方法,因为我似乎没有一个可靠的数字...
要获得答案,我们应该浏览.dex格式。在我们的情况下,最有趣的部分是method_ids
数组:
方法标识符列表。这些是所有方法的标识符 该文件提到的,无论是否在文件中定义。这 必须对列表进行排序,其中定义类型(由
type_id
索引)为 主要顺序,方法名称(由string_id
索引)是中间人 顺序和方法原型(通过proto_id
索引)是次要顺序。 该列表不得包含任何重复的条目。
不管阵列记录的数量存储为32位无符号整数(请参见method_ids_size
字段),在实践中,此数组不能包含的不超过65536
条目。这是因为invoke-xxxx
DEX指令的method_id
操作数是16位实体,必须是method_ids
的有效索引。结果记录具有更大的索引,即65535
将无法通过字节码无法访问。所有这些都导致了众所周知的" 64K方法"问题。
so,正如文档所说 - method_ids
的每种dex
和外部定义的方法都有一个记录。
因此,每次添加代码如下:
public native void foo();
在您的一个课程中 - 您在method_ids
中获得了一个额外的记录。abstract
方法的声明也是如此。然后,每次添加某些常规方法的实现,例如:
public void baz() {
/* ... */
}
您将获得baz()
本身的新记录,并记录baz()
引用的所有方法,尚未添加到method_ids
中。
本机代码对dex
内容没有影响,因为所有C/C 源都汇编为通过.so
文件分发的机器代码。这些使用具有自身限制的精灵格式,并且绝对独立于Dex。
- 在nodejs中使用本机代码的最佳方法是什么?
- 多次调用本机方法时出现致命错误
- 使用本机 JNI 静态方法实现C++ Java 运行时错误
- 努力使用 C# 从本机 DLL 调用该方法
- 在 C++/CLI 中从本机转换为管理无符号短的最快方法
- Android 无法从本机代码调用 Java 方法 JNI
- 将本机方法添加到 OpenJDK 源代码
- 如何将类对象传递给 jni 本机方法
- 有什么方法可以用本机C 代码替换Windows API计时器(settimer)
- 将 C++/CLI 对象指针传递给本机对象方法
- JNI 本机静态方法拦截
- 操作方法:将 boost::endian 缓冲区类型转换回本机格式
- 如何传递InteropServices.ComTypes.IStream到接受IStream*的本机方法,使用c++/c
- 如何在本机回调中使用Cython CDEF类成员方法
- 是在DEX文件方法计数中计数的本机C 方法
- 从java调用本机方法时使用Libc SIGSEGV
- 本机方法中的不满意的Linkerror
- Windows Service 无法调用 C++ 本机方法 [DllImpor( "myDLL" )]
- 参数通过本机方法
- 无法调用本机方法 Eclipse