今天想看看android 虚拟机 GetByteArrayElements 的实现 一直没发现。分析才知 它被藏在宏里面了。
PRIMITIVE_ARRAY_FUNCTIONS(jbyte, Byte); 》展开了宏包含了一系列函数
PRIMITIVE_ARRAY_FUNCTIONS 宏定义是
#define PRIMITIVE_ARRAY_FUNCTIONS(_ctype, _jname) \\
GET_PRIMITIVE_ARRAY_ELEMENTS(_ctype, _jname); \\
RELEASE_PRIMITIVE_ARRAY_ELEMENTS(_ctype, _jname); \\
GET_PRIMITIVE_ARRAY_REGION(_ctype, _jname); \\
SET_PRIMITIVE_ARRAY_REGION(_ctype, _jname);
其中GET_PRIMITIVE_ARRAY_ELEMENTS的定义如下
#define GET_PRIMITIVE_ARRAY_ELEMENTS(_ctype, _jname) \\
static _ctype* Get##_jname##ArrayElements(JNIEnv* env, \\
_ctype##Array jarr, jboolean* isCopy) \\
{ \\
ScopedJniThreadState ts(env); \\
ArrayObject* arrayObj (ArrayObject*) dvmDecodeIndirectRef(env, jarr); \\
pinPrimitiveArray(arrayObj); \\
_ctype* data (_ctype*) (void*) arrayObj- contents; \\
if (isCopy ! NULL) { \\
*isCopy JNI_FALSE; \\
} \\
return data; \\
}
都在jni.cpp 这个文件里。
可以发现是不复制的 *isCopy JNI_FALSE; 的 是pin来的 pinPrimitiveArray(arrayObj);
pin的中文在这里不知道是怎么说
点赞 评论
本文链接: http://newbrookintl.immuno-online.com/view-764636.html