https://developer.android.google.cn/ndk/guides/index.html
原生開發(fā)工具包 (NDK) 是一組可讓您在 Android 應(yīng)用中利用 C 和 C++ 代碼的工具。 可用以從您自己的源代碼構(gòu)建,或者利用現(xiàn)有的預(yù)構(gòu)建庫。
NDK 不適用于大多數(shù)初學(xué)的 Android 編程者,對許多類型的 Android 應(yīng)用沒什么價值。 因為它不可避免地會增加開發(fā)過程的復(fù)雜性,所以通常不值得使用。 但如果您需要執(zhí)行以下操作,它可能很有用:
從設(shè)備獲取卓越性能以用于計算密集型應(yīng)用,例如游戲或物理模擬。
重復(fù)使用您自己或其他開發(fā)者的 C 或 C++ 庫。
下載地址:
https://developer.android.google.cn/ndk/downloads/index.html
編譯環(huán)境:
gradle 2.1
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
}
NDK版本
android-ndk-r13b-windows-x86_64
谷歌中國下載
Android Studio 2.0版本
設(shè)置NDK目錄
File —> Project Structure —> SDK Location —> Android NDK location
環(huán)境配置
1,在項目根目錄下的gradle.properties文件里添加
android.useDeprecatedNdk=true
2,在項目根目錄下的local.properties文件里添加ndk的目錄
ndk.dir=D\:\\work\\android-ndk-r13b-windows-x86_64
3,在項目app目錄下的build.gradle文件里添加如下片段
android {
...
defaultConfig {
...
ndk {
moduleName "Sample" //模塊名稱,對應(yīng)的動態(tài)鏈接庫名稱libSample
ldLibs = ["log"] //在JNI打log 必須加上log,否則會報錯log函數(shù)未定義
}
}
}
編譯工程
1,創(chuàng)建一個類,編寫本地方法,加載so庫
package com.starry.jni;
public class JNISample {
static {
System.loadLibrary("Sample");
}
public native String getString();
}
2,生成頭文件,打開Android Studio Terminal窗口(左下角),輸入以下指令
cd app/src/main/java //進入到j(luò)ava目錄
javah -jni com.starry.jni.JNISample //生成 點h文件
3,新建jni目錄,右鍵工程下的app目錄 —> Folder —> JNI Folder —> New Android Component —> Finish,默認是會在app/src/main目錄下生成jni目錄
4,把第二步生成的com_starry_jni_JNISample.h文件拷貝至第三步生成的jni目錄下
5,右鍵jni目錄,New —> C/C++ Source File,新建與頭文件相同名稱的cpp文件com_starry_jni_JNISample.cpp,完整代碼如下
#include "com_starry_jni_JNISample.h"
JNIEXPORT jstring JNICALL Java_com_starry_jni_JNISample_getString (JNIEnv *env, jobject obj){
return env -> NewStringUTF("我來自JNI");
}
6,在Activity里調(diào)用,代碼如下
...
JNISample jniSample = new JNISample();
String string = jniSample.getString();
...
7,重新編譯下工程或直接布署代碼到手機上,成功就會在app/build/intermediates/ndk/debug/lib目錄下生成相應(yīng)的so庫文件
8,示例代碼下載
注:
1,JNISample類里邊不能用中文件字符
2,我的NDK是從官網(wǎng)下載的,使用Android Studio提供的NDK死活編譯不過
3,cpp文件和h文件名稱可以自定義,但是最好按照ndk生成的格式命名,方法命名必須按照生成的頭文件里的規(guī)范命名(Java_包名_類名_方法名稱)
4,D:\work\android-ndk-r13b-windows-x86_64\platforms\android-22\arch-arm\usr\include目錄里包含了ndk開發(fā)所有使用到的頭文件,做jni開發(fā)可以查看jni.h頭文件里提供函數(shù)。
5,點擊右上角Gradle —> 當前項目 —> app —> Tasks —> Build —> assembleRelease,打包完成,.so文件會自動拷貝到lib目錄下,不需要手動拷貝