https://developer.android.google.cn/ndk/guides/index.html
原生開發(fā)工具包 (NDK) 是一組可讓您在 Android 應用中利用 C 和 C++ 代碼的工具管闷。 可用以從您自己的源代碼構建辨图,或者利用現(xiàn)有的預構建庫。
NDK 不適用于大多數(shù)初學的 Android 編程者,對許多類型的 Android 應用沒什么價值挟伙。 因為它不可避免地會增加開發(fā)過程的復雜性老虫,所以通常不值得使用烫沙。 但如果您需要執(zhí)行以下操作镣隶,它可能很有用:
從設備獲取卓越性能以用于計算密集型應用,例如游戲或物理模擬六敬。
重復使用您自己或其他開發(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版本
設置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" //模塊名稱,對應的動態(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 //進入到java目錄
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里調用伏伯,代碼如下
...
JNISample jniSample = new JNISample();
String string = jniSample.getString();
...
7橘洞,重新編譯下工程或直接布署代碼到手機上,成功就會在app/build/intermediates/ndk/debug/lib目錄下生成相應的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目錄下辩稽,不需要手動拷貝