首先集成ndk編譯環(huán)境
配置
1.gradle.properties中加入android.useDeprecatedNdk=true
開啟項目支持
2.在模塊的build.gradle中加入
ndk { moduleName "huazict" //生成的so名字请垛,即你要System.loadLibrary的名字 abiFilters "armeabi", "armeabi-v7a", "x86" //輸出指定三種abi體系結(jié)構(gòu)下的so庫探赫。 }
其中moduleName是你加載靜態(tài)lib時的名字
網(wǎng)上ndk的介紹有很多阳液,這里說下自己遇到的坑翔怎,
在src\main下新建文件夾jni
生成.h文件
先進到debug目錄下
然后執(zhí)行 javah 包名+類名曲横。
javah com.example.admin.myapplication.ndkclass.MyNdkClass
然后生成c文件种远,名字隨便妊馈(用于實現(xiàn).h文件中的方法)
千萬記得別寫錯c文件里面的東西
理論上到這里編譯一下就會出來的
參考http://www.2cto.com/kf/201607/526887.html
最后使用別人的.so文件
原理:so文件是由.c和.h文件編譯出來的鼓蜒,而.h文件又是由我們自定義的native方法的類編譯出來的,所以我們要使用別人的.so泻帮。那么必須用別人的native方法精置,即將別人的有native方法的類全部拷貝過來,包名類名都不能變锣杂。(第三方的so都會跟上自己的jar)
遺留bug
我在我項目里面使用ndk怎么都編譯不出.so文件出來脂倦,新建一個項目(單模塊和多模塊,支持C++和不支持c++的都試了元莫,都可以)后就能成功編譯出來赖阻。
后來多寫了幾遍就好了,估計是c文件那里寫的有問題踱蠢,又沒有提示火欧,很煩。
總結(jié)
- 1集成ndk編譯環(huán)境茎截,(ndk編譯工具苇侵,gradle.properties中開啟項目支持,在模塊* build.gradle中添加生成的so文件名)
- 2生成.h文件
- 3生成.c文件(千萬別寫錯c文件了企锌,不然編譯不出so文件榆浓,但是編譯又通的過)
- 4rebuild