.so庫第一次見到是在搜索Android保存靜態祕鑰等特殊id字段作法時看到的-經過NDK的方式將靜態祕鑰保存在so文件中, 關於原生開發工具包(NDK)詳細見官網指南要更詳細,這裏我記錄我度娘各類結果後的實現.java
在工具中添加自定義工具添加javah命令和dnk-build命令android
這裏name:自定義命令名c++
Program:$JDKPath$/bin/javah $JDKPath$JDK路徑 ide
Parameters:-classpath . -jni -d $ModuleFileDir$/src/main/jni $FileClass$ 生成的.h文件命令工具
Working directory:$ModuleFileDir$/src/main/java 文件生成後存放的目錄-這個會在項目一級目錄的src/main/java 下生成一個jni文件夾 .h文件就存放在裏面開發工具
下面添加ndk-build命令:gradle
命令工具添加後 咱們先來生成JNIDemo類ui
public class JNIDemo { public native void testHello(); public static void main(String[] args){ //加載C文件 System.loadLibrary("TestJNI"); JNIDemo jniDemo = new JNIDemo(); jniDemo.testHello(); } }
選中java文件右鍵 經過External Tools生成javah文件,成功後會在/src/main 下生成jni文件夾 .h文件spa
如上圖,.h文件生成後這個時候咱們須要本身建立c/c++文件 JNIDemo.cpp 將.h中方法和屬性粘貼複製過去code
JNIDemo.h
JNIDemo.cpp
這裏具體怎麼寫,其實本人也不知道哈哈哈~,能夠搜下相關JNI教程
在 JNIDemo.java-JNIDemo.h-JNIDemo.cpp 文件都有了後 能夠開始生成so庫,生成so庫的時候須要注意 JNIDemo.h、JNIDemo.cpp都須要在上面說的jni文件夾中
而且jni文件夾中還須要增長Android.mk、Application.mk 做爲初學者開始連mk文件怎麼建立都有些懵 不知道的能夠瞧一眼右鍵New->File->Android.mk 就能夠了
生成so庫前,須要早gradle.properties:中添加
android.useDeprecateNdk=true
Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := TestJNI
LOCAL_C_INCLUDES := JNIDemo.h
LOCAL_SRC_FILES := JNIDemo.cpp
include $(BUILD_SHARED_LIBRARY)
上面必須保證語法還有文件名 引用的模塊正確 否則會出錯
LOCAL_PATH:源文件路徑,宏my-dir由Build System提供,返回包含Android.mk的目錄路徑
每一個Android.mk文件必須以定義LOCAL_PATH爲開始,用於開發tree中查找源文件
include $(CLEAR_VARS): 能夠參考官方指南~ ~ ~ ~
LOCAL_MODULE:要載入的模塊庫,與System.loadLibrary("TestJNI")中的參數保持一致
LOCAL_SRC_FILES:要編譯的源文件
LOCAL_C_INCLUDES: 要引用的文件
Application.mk:
APP_PLATFORM := android-14
APP_PLATFORM 最低支持版本 這個須要與App的minSdkVersion相對應
到這裏基本上沒問題了,咱們能夠選中JNIDemo.cpp文件右鍵External Tools dnk-build生成庫,若是成功的話會生成libs、obj文件夾
到這裏生成.so庫 大概就是這樣,後面還有不少坑,繼續入坑~ ~ ~