我使用JNI的Android 1.5.1工作室針對Android的API 18,我的問題是調用堆棧Dalvik的:從本地代碼
問題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)
問題2)如何與所需的值定義所需的參數調用的Dalvik內部的功能呢?例如,在我調用dvmDumpThreadStack函數之前,如何在調用函數之前定義目標和線程,以及在它們中存儲哪些值。
你的意思是這樣調用: dvmDumpThreadStack(dvmDumpThread(dvmThreadSelf(),FALSE),dvmThreadSelf()),但使用dlsym()來獲取函數指針 – User
同樣的dlsym()需要一個文件句柄對象文件。並找到Dalvik Stack.o目標文件的句柄似乎不起作用: handle = dlopen(「Stack.o」,RTLD_NOW); func =(void(*)())dlsym(handle,「dvmDumpThreadStack」); – User
檢查'dlsym()'的手冊頁,特別是關於兩個「僞手柄」。 C++對象使用「mangled」名稱,因此對於C++源代碼,符號不會簡單地爲「dvmDumpThreadStack」。使用帶有-D標誌的NDK中的'nm'命令(android-eabi-nm或類似的東西)掃描dalvik .so作爲符號名稱。您可以使用'C++ filt'來取消您發現的名稱,以確認您擁有正確的東西。 – fadden