Andorid 生成NDK動態連接庫 .so庫

  .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庫 大概就是這樣,後面還有不少坑,繼續入坑~ ~ ~ 
相關文章
相關標籤/搜索