日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android native java_在Android Native层中创建Java虚拟机实例

發布時間:2023/11/27 Android 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android native java_在Android Native层中创建Java虚拟机实例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

Android應用中JNI代碼,是作為本地方法運行的。而大部分情況下,這些JNI方法均需要傳遞Dalvik虛擬機實例作為第一個參數。例如,你需要用虛擬機實例來創建jstring和其他的Java對象、查找類或成員變量等。大部分情況下,在你用JNI接口從Java層調用Native層中的代碼時,你并不需要在native代碼中自己初始化一個Dalvik虛擬機實例。但是,如果你在搞逆向或者寫exp,你總是需要鉆研各種非常規的情況。

最近,我在逆向時需要在native代碼中手動創建虛擬機實例用于在JNI接口函數中傳遞Java對象。在本文中,我將分享我是如何實現這種方法的。

標準方法

在JNI中創建JVM虛擬機實例的官方文檔在地址How to Create a JVM Instance in JNI。但是,不幸的是這種方法在Android上面是不能正常運行的,因為jint JNI_CreateJavaVM(JavaVM**, JNIEnv**, void*)函數不是導出函數,無法直接調用。假如你不熟悉這個方法的話,可以根據它的名字在jni.h文件中查找一下,確認是否是導出函數。在我這里,jni.h文件位于android-sdk/ ndk-bundle/platforms/android-9/arch-x86/usr/include/jni.h。相關代碼如下:

如果你嘗試編譯調用上述截圖中函數的代碼,你可能會得到下面的錯誤:

官方文檔中介紹的如何創建JVM的方法在這里可以用來理解上述的API函數和它們的選項和參數的用途。如果你想在Android中使用這些方法,你必須顯示從so庫中調用這些方法。

官方文檔中介紹的如何初始化虛擬機的類路徑,在此處是非常有用的。其內容如下:

上面的配置,設置當前的類路徑為當前目錄(.)。如果你想要虛擬機訪問系統或者app的類,這是必須設置的。實驗表明,將該值設置為一個目錄并不會起作用。我嘗試將其設置為/data/local/tmp,同時在該目錄下放置了一個dex文件、含有dex文件的jar包和apk文件。只有在設置jar包、dex文件或apk文件的全路徑時,上述選項才起作用。奇怪的是,當類路徑中沒有一個合法的文件時,系統類(例如java.lang.String)都不能訪問。換句話說,除非類路徑中至少有一個文件,否則語句(*env)->FindClass(env, "java.lang.String")返回0,甚至java.lang.String這樣定義在框架中的類都無法訪問。

為了測試,下面將一個apk文件push到模擬器或真機設備中。

JavaVMOption的使用如下:

你現在可以使用FindClass函數來加載系統或者app的類。此外,如果你需要加載本地庫到你的虛擬機中,例如在靜態初始化器中加載一個庫文件,你可以使用optionString = "-Djava.library.path=/data/local/tmp"這樣的設置。這有個樣例代碼。

UniccUnlock方法

從文件UniccUnlock.cpp中,展示了另外一種創建虛擬機的類似技巧。我不敢說我完全理解了它在做什么,但是其中吸引我的是get_transaction_code部分。下面是它的做的事:

代碼看起來像是根據成員值判斷當前設備是否已經解鎖或者是解鎖方法是否成功。反正我是不很確定,不過我也就想抽取其中創建虛擬機的代碼而已。

該方法是通過在庫文件libnativehelper.so或者libdvm.so中加載創建虛擬機相關的方法。但是,下面幾行代碼看起來很奇怪:

任何地方都無法找到這幾個方法的文檔說明。不過,發現這些方法調用的人相當聰明。如果不調用這些方法,你就會得到下面奇怪的錯誤信息:

除了這幾個奇怪的方法,這種方式創建虛擬機對我很好使。但是,我想知道_ZN13JniInvocationC1Ev方法都做了什么,在不同版本間的Android系統中是否可移植。我的直覺告訴我,硬編碼的方法名可能會導致在不同的設備或者Android版本間的不兼容性。

Surfaceflinger 方法

最終,我在谷歌的Surfaceflinger服務的源碼中找到了:DdmConnection.cpp。

它默認查找了在libdvm.so中的函數JNI_CreateJavaVM。它沒有調用方法_ZN13JniInvocation,而是調用了庫libandroid_runtime.so中的Java_com_android_internal_util_WithFramework_registerNatives方法。registerNatives方法的內容在此描述了。

同時,感興趣的是創建虛擬機的選項:

這些選項在這篇文檔中詳細描述了。根據文檔,它僅僅用于調試JVM時使用。

同時,我注意到它JNI的版本是1_4,但是我設置為1_6了,因為谷歌的樣例代碼中就是這樣設置的。下面就是jni.h中支持的版本號:

最后,我使用上面的方式來創建虛擬機,因為它來自谷歌,具有很好的健壯性和兼容性。

最終代碼

下面就是最終的創建虛擬機的代碼:

下面是其使用方法:

總結

以上是生活随笔為你收集整理的android native java_在Android Native层中创建Java虚拟机实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

歡迎分享!

轉載請說明來源于"生活随笔",并保留原作者的名字。

本文地址:android native java_在Android N

主站蜘蛛池模板: 黄色录像一级大片 | 网站免费视频www | 黑名单上的人全集免费观看 | 亚洲无卡视频 | 国产精品久久国产精品99 | 国产美女明星三级做爰 | 又黄又爽又色的视频 | 精品+无码+在线观看 | 亚洲免费久久 | 三年中文免费观看大全动漫 | 婷婷色在线 | 亚洲91网| 色91在线| 给我看免费高清在线观看 | 中文在线а√天堂官网 | 日日干,夜夜操 | 欧洲日韩一区二区三区 | 一区二区小视频 | 97人人爱 | 紧身裙女教师三上悠亚红杏 | 日本中文视频 | 白石茉莉奈中文字幕在 | 欧美日韩一区二区三区在线电影 | 在线精品一区 | 国产精品伦理 | 激情视频亚洲 | 涩涩涩涩涩涩涩涩涩 | 三级av在线免费观看 | 久草视频网站 | 在线色资源 | 日本乱码一区二区 | 高清欧美性猛交xxxx黑人猛交 | www.色黄 | 国产成人在线免费 | 91精品国产aⅴ一区二区 | 欧美精品一区二区蜜臀亚洲 | 91精品国产综合久久久蜜臀粉嫩 | 免费av影视 | 天天天天操 | 精品视频免费播放 | 黄页网站在线看 | 成年人黄色免费视频 | 男人天堂网在线视频 | 成人免费看片'在线观看 | 6996电视影片免费看 | 天天想你在线观看完整版电影高清 | 欧美另类videosbestsex日本 | 亚洲一区二区三区视频 | 欧美一级视频在线观看 | av观看网 | xxx国产| jizz91| 国产 欧美 日韩 一区 | 影音先锋亚洲天堂 | 欧美成人免费在线观看 | 日本成人毛片 | 做爰视频毛片视频 | 亚洲AV无码成人片在线观看 | 久91| 黑丝国产在线 | 久久123 | 国产综合视频一区 | 男人爽女人下面动态图 | 99久久久无码国产精品衣服 | 国产精品一区二区自拍 | 色网站在线免费观看 | 久久久久无码精品国产 | 亚洲av无码成人精品区 | 国产又粗又猛又爽又黄的视频在线观看动漫 | 久久精品二区 | 成人91网站| 久久久综合网 | 亚洲av日韩av高潮潮喷无码 | 尤物视频免费在线观看 | 免费在线播放av | 国产精品久久久爽爽爽麻豆色哟哟 | 日韩欧美一区二区三区在线观看 | 致单身男女免费观看完整版 | 亚洲AV无码久久精品国产一区 | 日韩三级免费看 | 中文字幕色 | 思思99精品视频在线观看 | 精品一区二区久久久久蜜桃 | 很污很黄的网站 | 国产不卡在线观看视频 | 毛片在线播放视频 | 99在线国产 | 人妻天天爽夜夜爽一区二区三区 | 五月天开心激情 | 东京干手机福利视频 | 97国产精品人人爽人人做 | 国产欧美一区二区精品性色99 | 激情综合一区二区三区 | 欧美日本二区 | 麻豆精品国产传媒 | 免费在线观看网址入口 | 久久性 | 欧美一区二区三区在线 | 天天操你 |