Android Studio NDK 開發(fā)與調(diào)試(生成 .so 文件)

溫馨提示:如果你的 Android Studio 版本在 2.2 以上 , 建議你用 cMake 的新姿勢(shì)進(jìn)行 NDK 開發(fā) : http://m.itdecent.cn/p/e03028f826d7
我相信你會(huì)愛(ài)上 cMake 的;

1. 環(huán)境搭建

俗話說(shuō) “工欲善其事,必先利其器” ;所以咱還是得先下載 ndk;
下載地址 :https://developer.android.com/ndk/downloads/index.html(需要翻墻,你懂得)
或者可以直接在 Android Studio 里面下載,這就可以免去翻墻,
File-->Project Structure

image1.png

如果你已經(jīng)下載,直接選擇你 ndk 的位置;
如果沒(méi)有下載,在紅色框這個(gè)位置會(huì)有位置提示你下載,點(diǎn)擊下載就行;
添加 ndk 后你會(huì)在 local.properties 這個(gè)文件看到(路徑取決于你 ndk 的位置):
image2.png

莫慌,還差最后一步:
image3.png

在此處加上這句代碼:android.useDeprecatedNdk=true
好了,ndk 環(huán)境搭建完畢!

2. java 代碼與 c 代碼編寫

首先新建個(gè) java 類

public class JniTest{
    static {
        System.loadLibrary("jary");
    }
    public native String getString();
}

然后重新編譯下你的 Project: Build-->Make Project(Ctrl+F9)
重新編譯之后就可以在對(duì)應(yīng)的文件夾看到編譯后的 JniTest.class
C:\ASworkspace\MyJniTest\app\build\intermediates\classes\debug\jary\com\myjnitest


image4.png

下一步來(lái)看怎么生成 .h 的文件
在 studio 打開 Terminal 命令行工具,打開步驟是 View-->Tool Windows-->Terminal (Alt+F12)

在命令行中先進(jìn)入到工程的 main 目錄下
輸入命令:javah -d jni -classpath 自己編譯后的 class 文件的絕對(duì)路徑
例如:javah -d jni -classpath
C:\ASworkspace\MyJniTest\app\build\intermediates\classes\debug jary.com.myjnitest.JniTest
注意 debug 后面是有個(gè)空格的,如圖:

image5.png

命令執(zhí)行后會(huì)在 main 目錄下(在哪個(gè)目錄下執(zhí)行就會(huì)在哪個(gè)目錄下生成 .h 文件)自動(dòng)生成 “jni” 文件夾,同時(shí)生成一個(gè) .h 的文件

imag6.png

這個(gè) .h 文件可不做修改 ;默認(rèn)就行
現(xiàn)在我們來(lái)寫一個(gè)測(cè)試的 C 文件 jary.c 同 .h 文件一樣放到 jni 文件夾下,代碼如下:


image7.png

依賴剛才生成的 .h 頭文件 ; 方法名與 .h 里面方法名保持一致 ;
最后在 build.gradle defaultConfig 中添加如下代碼

 ndk {   
        moduleName "jary"         //生成的so名字    
        abiFilters "armeabi", "armeabi-v7a", "x86"  //輸出指定三種abi體系結(jié)構(gòu)下的so庫(kù)。    
        stl "stlport_static"    //打開.c 的 debug , 下面第 4 點(diǎn)會(huì)講到
      }

到這里,jni 調(diào) C 就完成了,現(xiàn)在我們來(lái)測(cè)試一下,寫個(gè) TextView 顯示一下調(diào)用的 C:

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView tvJni = (TextView) findViewById(R.id.tvJni);
    tvJni.setText(new JniTest().getString());
}
}

效果如下圖 :


image8.png
3. 生成 .so 以及調(diào)用

編譯后的 .so 文件如下圖路徑:

image9.png

根據(jù)這個(gè)路徑就可以找到指定輸出的三種體系結(jié)構(gòu)下的 .so 文件,然后把 .so 文件復(fù)制出來(lái),如下圖所示的放到 jniLibs 文件夾下面,如下圖:

image10.png

注意: 放到 jniLibs 文件夾下面,build.gradle 里面什么都可以不用配置

還有一種方式是將 .so 文件 放在 libs 文件夾下面,注意在 build.gradle 添加如下配置:

iamge11.png
4. 關(guān)于ndk開發(fā)在 .c 文件里面的 debug

首先在 build.gradle 中添加如下代碼 :

android {
    ... ...
  defaultConfig {
      ... ...
     ndk {   
        moduleName "jary"         //生成的so名字    
        abiFilters "armeabi", "armeabi-v7a", "x86"  //輸出指定三種abi體系結(jié)構(gòu)下的so庫(kù)。    
        stl "stlport_static"    //打開.c 的 debug (此句是打開的debug的關(guān)鍵)
     }
  }
  buildTypes {
     debug {    
            jniDebuggable true //此句不加在真機(jī)上 debug 不受影響,但是在虛擬機(jī)上不能 debug
     }
  }

配置后如下圖 ,會(huì)出現(xiàn)一個(gè) app-native,選擇此項(xiàng)你就可以盡情的 debug 了:

image12.png

debug 如下圖:


image13.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容