使用android studio打包jar

1、需要使用一個輔助項目,我將其命名為MakeJar,用來編譯c或者c++文件,打包相應的jar包。

2、配置app目錄下的build.gradle文件 加粗的是在gradle.properties中設值

在android->defaultConfig的花括號里添加如下代碼
externalNativeBuild{
ndkBuild{
⑴、//設置 APP_PLATFORM,不是必要的,也可以在Application.mk中設置
arguments 'APP_PALTFORM=android-'+**TARGET_SDK_VERSION**

⑵、//設置 NDK_MODULE_PATH ,使用project.file 方法可以實現相對目錄的查找
def module_paths = [project.file("模型1").absolutePath,project.file("模型2").absolutePath,或者更多的模型]
//使用Os,要導入 import org.apache.tools.ant.taskdefs.condition.Os
if(Os.isFamily(Os.FAMILY_WINDOWS))
{

// 如果是Window 則需要使用 '/'
module_paths = module_paths.collect {it.replaceAll('\\\\', '/')}
arguments 'NDK_MODULE_PATH=' + module_paths.join(";")
}else{
arguments 'NDK_MODULE_PATH=' + module_paths.join(";")
}
⑶、//設置編譯的CPU核數。-j4 表示 4核同時編譯。加快編譯速度。
arguments '-j' + Runtime.runtime.availableProcessors()

⑷、//設置abi 從 APP_ABI自定義變量中獲取自己想要編譯的abi,這個APP_ABI 在gradle.properties中自定義設值。我這里使用 ':' 分號隔開不同的abi
abiFilters.addAll(**APP_ABI**.split(':').collect{it as String})

⑸、//設置NDK_PROJECT_PATH的路徑, (我找不到在其他地方設置這東西,所以我用了一個很暴力的方法,在arguments里面直接設置這個 :( ,如果有人知道可以留言。感謝)。在這里設置會造成的結果是,生成的 buildCommand 里面會有兩個NDK_PROJECT_PATH,第一個是null,第二個是自己設置的。
arguments 'NDK_PROJECT_PATH='+project.file("c/c++文件項目路徑").absolutePath
⑹、//如果要自己設置android.mk的地址就加入如下
path 'Android.mk文件相對此文件的地址'
//Android.mk和Application.mk的編寫具體看官方文檔
}
}

build.gradle里面的設置就如上所示。

然后就要在根目錄下的 gradle.properties 里設置自定義的值啦。
//我要要編譯cpu架構是 armeabi 和armeabi-v7a 的
APP_ABI=armeabi:armeabi-v7a
//我要編譯sdk版本為15 的
TARGET_SDK_VERSION=15

3、在java目錄下寫好相應的類

例如:HelloJni.java

4、編譯 jar文件 和 so文件

我是在Gradle projects視窗中 在other下找到jarReleaseClasses 的任務,雙擊編譯所有文件。
在build -> intermediates -> ndkBuild 下獲得所有的so文件
在build -> intermediates -> packaged 下獲得classes.jar文件,將其重命名就可以直接配合so文件一起使用了

5、在需要使用庫的項目中的gradle文件中加入

sourceSets { main { jniLibs.srcDirs = ['libs'] }}
加在android或括號里面。將so文件 jar 文件復制到libs。
右鍵jar文件,選擇as library 就可以添加為庫了。

文件內容實例:

Android.mk內容

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
MY_CPP_SOURCE_ROOT := $(LOCAL_PATH)/../CppCode/
LOCAL_SRC_FILES := $(MY_CPP_SOURCE_ROOT)/*.cpp
LOCAL_C_INCLUDES := $(MY_CPP_SOURCE_ROOT)/*.hpp
include $(BUILD_SHARED_LIBRARY)

Application.mk的內容

APP_PLATFORM := android-15

HelloJni.java內容

public class HelloJni
{
public native String stringFromJNI();
public boolean Initialize(){
try{
System.loadLibrary("hello-jni");
}catch(UnsatisfiedLinkError e){
return false;
}
return true;
}
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容