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;
}
}