壹***分為2步:
1.在Java中編寫要調用的靜態方法和需要加載的庫,並生成頭文件。
2.配置gradle
3.配置Android.mk文件和application.mk文件
下面壹步步的走:
首先需要在Java類中聲明要調用的方法,以及要加載的庫,我們在包下新建壹個jniUtil類,如下所示
[plain]?view plain?copy
public?class?jniUtil?{?
//要加載的庫,生成的庫格式為:lib+庫名.so?
?static{?System.loadLibrary("hello-jni");?}?
//要調用的本地方法,在c文件中該方法名稱格式為:java_包名_類名_方法名?
?public?static?native?String?stringFromJNI();?
}?
註意:在編譯時該類中不能有漢字,包括註釋,否則會出現編碼GBK的不可映射字符錯誤。
接下來就是利用external Tools生成頭文件.h,這裏可參考點擊打開鏈接
然後就會在main目錄下生成Jni文件夾,並且包含.h文件。下面就是編寫C文件,或者可以拷貝已經寫好的C文件放置在該jni文件夾中.
2.配置gradle
我們這裏不用gradle 去編譯,而是只讓他去加載已經生成的so庫,改用android.mk 去編譯(稍後配置android.mk)
在app的build.gradle 下的android 標簽下添加:
[plain]?view plain?copy
sourceSets?{?
main?{?
jni.srcDirs?=?[]//禁止gradle?自動編譯,使用已經編譯好的So庫?
jniLibs.srcDirs?=?['src/main/jniLibs','libs']//指向要使用的庫文件//的路徑,前邊的是自己項目的,後邊的是第三方的so?
}?
}?
從上面可以看出,我們生成的庫是放在
src/main/jniLibs
目錄下面的,那麽這個是如何配置呢?還是在該gradle下面配置ndk的編譯腳本,註意放在android標簽外面:
[plain]?view plain?copy
tasks.withType(JavaCompile)?{?
compileTask?->?compileTask.dependsOn?CopyToJniLibs?
}?
task?ndkBuild(type:?Exec,?description:?'Compile?JNI?source?via?NDK')?{?
Properties?properties?=?new?Properties()?
properties.load(project.rootProject.file('local.properties').newDataInputStream())?
def?ndkDir?=?properties.getProperty('ndk.dir')?
commandLine?"$ndkDir/ndk-build.cmd",?"NDK_PROJECT_PATH=$projectDir.absolutePath\\build",?"APP_BUILD_SCRIPT=$projectDir.absolutePath\\src\\main\\jni\\Android.mk",?"NDK_APPLICATION_MK=$projectDir.absolutePath\\src\\main\\jni\\Application.mk"?
//妳自己的mk文件目錄?
}?
在ndkbuild完成後把生成的so文件復制到jniLibs,這裏和上面配置的加載so文件路徑要壹致哦
[plain]?view plain?copy
task?CopyToJniLibs(type:?Copy,?dependsOn:?'ndkBuild',?description:?'copy?the?native?libs?to?jniLibs')?{?
from?fileTree(dir:?file(buildDir.absolutePath?+?'/libs'),?include:?'**/*.so')?
into?file('src/main/jniLibs')?
}?
新建Android.mk和application.mk,這裏我把Android.mk和application.mk放在jni文件夾下了,具體可以自己修改。默認生成的SO文件會在build下面的libs中,我們拷貝出來放到src/main/jniLibs下面。
3.配置Android.mk和Application.mk