我正在使用针对Android API 18的Android Studio 1.5.1的JNI,我的问题是:
Q.1)如何从本机代码调用Dalvik内部函数?
例如在Android source code,在解释器模块中,在stack.cpp中,如何从本机代码调用函数dvmDumpThreadStack(const DebugOutputTarget * target,Thread * thread)?
似乎我需要包含一些文件并链接到一些库,如answer中所述,但我需要具体的细节。我需要链接到哪些文件以及我需要在本机代码中包含哪些文件才能成功调用dvmDumpThreadStack函数?
这是Andorid.md文件的内容
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := MyLibrary
LOCAL_SRC_FILES := MyLibrary.c
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
include $(BUILD_SHARED_LIBRARY)
Q.2)如何使用所需的值定义所需的参数以调用Dalvik内部函数?例如,在我调用dvmDumpThreadStack函数之前,如何在调用函数之前定义目标和线程以及存储在其中的值。
答案 0 :(得分:1)
一般来说,你不是。他们被称为内部"功能是有原因的。
如果您真的决定这样做,可以使用dlsym()
在运行时查找地址来查找函数指针。你需要"受伤的"您可以通过使用nm
检查二进制文件来获取名称。 (在4.1或之后代码从C切换到C ++之前,这更容易。)通过调用Thread.cpp中的dvmGetThread
函数之一,您可以以与VM相同的方式获取Thread *( dvmGetThreadByHandle
,dvmGetThreadByThreadId
,dvmGetThreadFromThreadObject
),或者如果您对当前主题感兴趣,请致电dvmThreadSelf()
。将其传递给dvmDumpThread()
,这将设置DebugOutputTarget
,因此您不必这样做。
您不需要定义Thread *的头文件来传递Thread *。只需将thread-getter函数声明为返回void *,并将thread-dump函数声明为接受void *参数。如果您担心类型安全性和可移植性,请不要从应用程序调用内部VM功能。
有一次我真的想要这样做 - 调试一些东西,不记得是什么 - 我实际上向VM添加了一个新的extern "C"
函数,它没有参数,只是转储了当前的线程& #39;堆栈。这使一切变得更加容易。