有誰知道如何顯示所有通過NDK編譯的共享庫可用的公共面向JNI函數/方法的功能?在JNI共享庫中查找函數?
我有一個lib * jni.so文件,我需要訪問它的方法。使用nm -Dg lib * jni.so輸出共享庫中找到的所有符號。我只是在尋找那些被定義爲JNI鉤子的人。
感謝,在與本地方法的.class文件 凱文
有誰知道如何顯示所有通過NDK編譯的共享庫可用的公共面向JNI函數/方法的功能?在JNI共享庫中查找函數?
我有一個lib * jni.so文件,我需要訪問它的方法。使用nm -Dg lib * jni.so輸出共享庫中找到的所有符號。我只是在尋找那些被定義爲JNI鉤子的人。
感謝,在與本地方法的.class文件 凱文
有幾個技巧可以用來找出答案。
檢查相應的.class文件。如果您有該庫的.class文件,則可以在Eclipse中打開它們並搜索關鍵字native
以查看哪些方法已聲明爲在本機中實現。
使用strings
命令轉儲所有字符串。除非庫執行Java方法名的運行時連接等(不太可能),否則應該能夠列出大多數從.so引用的Java方法和類,其中strings
。使用正則表達式,可以過濾出有趣的字符串。例如,strings lib*jni.so | grep 'L[^;]*;'
將列出從.so引用的所有類(例如Lcom/somecompany/project/SomeClass;
)。將方法與類匹配可能會很棘手,但根據您的需要,這可能就足夠了。
構建Dalvik虛擬機的一個版本,每登錄一次本地方法就打印一條logcat消息。這是最先進,最耗時,但最準確的。只需按照指示在http://source.android.com/source/index.html建立一個Android模擬器,但是你建立之前,在dvmRegisterJNIMethod
年底dalvik/vm/Jni.cpp所以它成爲啓用調試打印:LOGI("JNI-registered %s.%s:%s", clazz->descriptor, methodName, signature);
運行javap
。