一、目标
这次的报错是get_byte_array_elements
/androidemu/java/jni_env.py", line 1492, in get_byte_array_elements
raise NotImplementedError()
NotImplementedError
二、步骤
这个方法作者没有实现,我们先google一下 GetByteArrayElements 函数的作用
参考文章 https://blog.csdn.net/brooknew/article/details/7583721
它的作用是将jbyteArray转成jbyte指针,参数有2个,jbyteArray对象和一个bool型的变量, 还得熟练参考android源代码:(
GetByteArrayElements和ReleaseByteArrayElements是成对出现的,我们实现如下:
def get_byte_array_elements(self, mu, env,array_idx,isCopy):
logger.debug("JNIEnv->get_byte_array_elements (%d,%d) was called ", array_idx,isCopy)
obj = self.get_local_reference(array_idx)
if not isinstance(obj,jbyteArray):
raise ValueError("Expected a jbyteArray")
data_ptr = self._emu.native_memory.allocate(len(obj.value))
mu.mem_write(data_ptr,bytes(obj.value))
return data_ptr
@native_method
def release_byte_array_elements(self, mu, env,jbArr,jb_ptr):
logger.debug("JNIEnv->release_byte_array_elements was called")
self._emu.native_memory.free(jb_ptr)
继续跑,成功跑过去…… 明天继续
三、总结
补齐jni函数有下面三个方法
- google 看看有没有别的兄弟已经实现了
- 参考aosp(Android Open Source Project),这需要有个好一点的源代码阅读器
- 参考unidbg,unidbg在jni函数的实现上比较努力,比AndroidNativeEmu要完善的多
关注微信公众号,最新技术干货实时推送