1. 程式人生 > >androidStudio關聯靜態庫(.a)/動態庫(.so)原始碼除錯

androidStudio關聯靜態庫(.a)/動態庫(.so)原始碼除錯

閱讀前提

需求

Android JNI開發的時候,需要對C++原始碼進行除錯,如果C++原始碼就在專案中,那好辦,閱讀該文到一半就可以除錯了,如果專案中只有C++對應的動態庫靜態庫,原始碼另外存在,那怎麼辦?

參照物

AndroidStudio中配置

  1. 如果Android jni是以module(native)的形式存在的,如我的Android專案,需要在module(native)的gradle中配置如下:

    android {
        //關鍵點*****
        publishNonDefault true
        compileSdkVersion 26
        buildToolsVersion "26.0.1"
    defaultConfig { minSdkVersion 14 targetSdkVersion 26 versionCode 1 versionName "1.0"
  2. 在app的gradle中新增依賴,如下:

        dependencies {
            compile fileTree(dir: 'libs', include: ['*.jar'])
            androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2'
    , { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:26.+' compile 'com.android.support.constraint:constraint-layout:1.0.2' testCompile 'junit:junit:4.12' //關鍵點*****start releaseCompile project(path: ':native'
    , configuration: 'release') debugCompile project(path: ':native', configuration: 'debug') //關鍵點*****end }
  3. AndroidStudio中快鍵鍵ctrl+alt+shift+S開啟project structure視窗,也可以如圖開啟:

    開啟設定視窗

  4. 選中native,同時選中build Types–>debug(根據自己的需求,如果Release也想debug的話那就一起設定),然後將DebuggableJni Debuggable 都設定為true.如果JNI開發沒有分開,那就直接設定app

    設定結果

  5. 按如圖方式開啟Run/Debug Configurations視窗

    這裡寫圖片描述

  6. 按照如下標記步驟設定,其中設定Debug Type的時候選擇Auto,如果選擇Java或者Native的話只能除錯java或者Native.

    這裡寫圖片描述

  7. [修正:原始碼沒有在AS中的,經過驗證,直接拖到AS中也可以除錯,所以該步可以不看了]對於C++原始碼就在Android工程中的,經過上面6步就可以在需要除錯的地方進行斷點除錯了.但是,如果需求跟我的一樣,使用的是第三方靜態庫或者動態庫,有原始碼但原始碼不在Android工程中,還需要設定 Symbol Directores ,設定什麼鬼?我也不知道,@^_^,百度吧!怎麼設定呢?直接點選"+ "按鈕,定位到原始碼的最外層目錄,如我當前的C++原始碼我放在了桌面,直接定位的桌面對應的資料夾,點選確定就可以了.

    這裡寫圖片描述

    這裡寫圖片描述

  8. 將需要除錯的原始碼拖到AS編輯視窗中(注意,將As縮小點然後開啟原始碼檔案拖動到編輯區域就可以了),如,假設我當前需要除錯Add.cpp的方法,我的斷點如圖,shift+f9啟動除錯,看看是不是可以跟除錯java程式碼一樣的除錯了[email protected]^_^
    這裡寫圖片描述
    這裡寫圖片描述

  9. 上面的忘記一點,補充下.Native除錯需要LLDB,開啟SDK Manager中SDK Tools裡面選中LLDB,然後進行安裝.

    這裡寫圖片描述

最後

由於開啟JNI debug除錯,所以啟動除錯的時候要載入很多庫,導致很慢很慢,我沒有找到好的解決辦法,如果哪位大神有好的解決方案,請告知!
以上就是AS中除錯Native程式碼的以及關聯靜態庫動態庫原始碼的配置.
有問題請留言或者:[email protected]

相關推薦

androidStudio關聯靜態(.a)/動態(.so)原始碼除錯

閱讀前提 需求 Android JNI開發的時候,需要對C++原始碼進行除錯,如果C++原始碼就在專案中,那好辦,閱讀該文到一半就可以除錯了,如果專案中只有C++對應的動態庫靜態庫,原始碼另外存在,那怎麼辦? 參照物 AndroidS

Linux下靜態動態(.a、.so

ref:http://niefei.blog.ccidnet.com/blog/ccid/do_showone/tid_42855.html 1. 介紹   使用GNU的工具我們如何在Linux下建立自己的程式函式庫?一個“程式函式庫”簡單的說就是一個檔案包含了一些編譯好的程式碼和資料,這些編譯好的程式碼和資

靜態動態、/etc/ld.so.conf 和ldconfig

動態庫和靜態庫https://blog.csdn.net/lz_equal/article/details/52439441/etc/ld.so.conf 和ldconfighttps://blog.csdn.net/fangquan1980/article/details/

ffmpeg的ubuntu的編譯過程(編譯靜態動態

ffmpeg第一步源碼下載通過git下載git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg或者直接下載wget http://ffmpeg.org/releases/ffmpeg-3.3.tar.bz2如果是下載的ffmpeg-3.3.tar.bz2 需要進

關於Linux靜態動態的分析

所在 mis color 先後 main 技術 哪些 共享 協議 關於Linux靜態庫和動態庫的分析 關於Linux靜態庫和動態庫的分析 1.什麽是庫 在windows平臺和linux平臺下都大量存在著庫。 本質上來說庫是一種可運行代碼的二進制形式。能夠被操作系

靜態動態的使用

window != 函數調用 img clas 處理 dllexport void 再看 1.靜態庫使用比較簡單,就兩步 @1包含靜態庫頭文件#include "文件名" @2預處理加載靜態庫 #pragma comment(lib,"庫文件名") 2.再看動態庫 @1首先

靜態動態的簡單說明

外部程序 endif ldconfig 開始 director 有時 鏈接 現在 con   一.靜態庫和動態庫的簡單介紹   程序設計的模塊化是人們一直在追求的目標,因為當一個系統十分復雜的時候,將系統模塊化既可以並行開發,又可以增強程序的可用性,降低程序間的耦合度。在一

Windows靜態動態的創建和使用(VS2005)

spec 占用內存 庫文件 工程 存在 中間 開發程序 文件的 系統 偶們在實際的編程開發中,經常會遇到運行時無法找到某個DLL文件或者鏈接時無法找到某個LIB文件。然後,我們就開始亂GOOGLE一下,然後將VS2005的設置改變一下,或許就Ok了,我們將別人開發的DLL或

linux下的靜態動態

列表 可執行文件 運行時 打包 文件的 ade 命令 div library 一、linux下的靜態庫 靜態庫中的被調用的函數的代碼會在編譯時一起被復制到可執行文件中去的!!可執行文件在運行不需要靜態庫的存在! 二、linux下動態庫的構建和使用 1、動態庫的構建

深入探討Linux靜態動態的詳解(轉)

share 分享 命名 one .com 過程 程序 簡單介紹 mage 2.生成動態庫並使用 linux下編譯時通過 -shared 參數可以生成動態庫(.so)文件,如下 庫從本質上來說是一種可執行代碼的二進制格式,可以被載入內存中執行。庫分靜態庫和動態庫兩種。

linux+vs2013編譯靜態動態

cal 控制 文件 urn 運行時 names c++ spec using Linux下創建與使用靜態庫 Linux靜態庫命名規則 Linux靜態庫命名規範,必須是"lib[your_library_name].a":lib為前綴,中間是靜態庫名,擴展名為.a。 創建靜態

linux 靜態動態(共享)的制作與使用(註意覆蓋問題)

png 環境變量 src bfile idt 鏈接器 問題 靜態 插入 一、linux操作系統支持的函數庫分支   靜態庫:libxxx.a,在編譯時就將庫編譯進可執行程序     優點:程序的運行環境中不需要外部的函數庫     缺點:可執行程序大   動態庫:又

靜態動態的兩種不同的Makefile寫法

不同 .so code lib pic 動態庫 sha stat 靜態 動態庫 PROG=add BIN=$(PROG).bin SOADD= lib$(PROG).so SHAREDOBJS= $(PROG).o OBJS= main.o CC=gcc $(PROG)

靜態動態編程技術

c++ 動態庫 靜態庫 (1)庫一、什麽是庫 庫從本質上來說是一種代碼重用的方式,即預先編譯可執行代碼的二進制格式,可以被載入內存中,執行,比如C運行庫,裏面實現了基本的函數,我們無需在寫一遍,直接調用接口即可.庫分為靜態庫和動態庫兩種,二、靜態庫和動態庫區別1.靜態函數庫這類庫名字一般是x

Linux下靜態動態

Linux 靜態庫 動態庫 靜態庫 先說說我們為什麽需要庫?當有些代碼我們大量會在程序中使用比如(scanf,printf等)這些函數我們需要在程序中頻繁使用,於是我們就把這些代碼編譯為庫文件,在需要使用時我們直接鏈接即可。 定義: ?程序在編譯時把靜態庫的代碼鏈接到可執行程序中,在代碼運行時不再

Windows系統下靜態動態的使用方法

系統 comment 入庫 自己 動態庫 lib windows系統 window ont 使用靜態庫時,我們需要別人提供的頭文件和lib文件,然後在自己的工程的源文件(.cpp文件)中添加頭文件和#pragma comment(lib, "靜態庫的路徑") 使用動態庫時

Windows系統下靜態動態的生成方法

fine end def imp XP fin windows 靜態 style 靜態庫的生成方法:直接創建靜態庫項目,寫好功能後,編譯生成即可,把頭文件和靜態庫提供給別人即可使用 動態庫的生成方法:創建動態庫項目,在頭文件中寫入: #ifdef DLLEXPORT #de

靜態動態的區別和win平臺和linux平臺代碼實現

linux動態庫 聲明 CP 控制臺程序 後綴 差異 創建 SM mes 什麽是庫   庫是寫好的,現有的,成熟的,可以復用的代碼。現實中每個程序都要依賴很多基礎的底層庫,不可能每個人的代碼都從零開始,因此庫的存在意義非同尋常。   本質上來說,庫是一種可

靜態動態

pac 代碼 post 頭文件 tab clas 動態庫 sage 生成 庫文件是已經編譯好的二進制代碼。這個二進制代碼可以是動態的,如 .so 也可以是靜態的,如 .a ,如果是動態的,則你最後生成的程序文件在運行時,需要這個動態庫的支持,如果是靜態的,則你最後生成的

AndroidStudio結合JNI使用JrtpLib動態(一)

上一篇文章介紹瞭如何編譯生成JrtpLib的庫檔案,這篇文章探討如何在Android上使用編譯出的庫檔案。 1.建立專案勾選 Include C++ support 2.建立存放庫檔案和標頭檔案的存放目錄並將對應檔案新增其中 3.修改CMakeLists.txt: 新增庫(add_lib