app下的build.gradle中加入:
defaultConfig { ... externalNativeBuild { cmake { cppFlags "-std=c++11 -frtti -fexceptions" } } ndk { abiFilters 'armeabi','armeabi-v7a','x86' } } sourceSets.main { jniLibs.srcDirs = ['src/main/jniLibs'] } externalNativeBuild { cmake { path "CMakeLists.txt" } }
gradle.properties中增加下面的屬性使用舊版的ndk功能(不添加會使用實驗性的ndk構建工具)
android.useDeprecatedNdk=true
配置CMakeLists:
cmake_minimum_required(VERSION 3.4.1)
add_library( native-lib
SHARED
src/main/cpp/native-lib.cpp
src/main/cpp/test_ffmpeg.cpp)
find_library( log-lib
log )
find_library( android-lib
android )
#set(distribution_DIR ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI})
set(CMAKE_VERBOSE_MAKEFILE on)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
include_directories(src/main/cpp)
target_link_libraries(native-lib
${log-lib}
${android-lib})
聲明native方法
public class JniUtils {
public static native int getCountJNI(int x, int y);
}
使用AS的Terminal窗口
執行命令:
cd app/src/main/java
然後執行:
javah -jni wjy.geridge.com.testndk.jni.JniUtils(JniUtils類全路徑)
會在app/src/main/java目錄下生成wjy_geridge_com_testndk_jni_JniUtils.h文件
將wjy_geridge_com_testndk_jni_JniUtils.h文件剪切到cpp目錄
在創建一個c/c++文件加入如下代碼:
#include "wjy_geridge_com_testndk_jni_JniUtils.h"
JNIEXPORT jint JNICALL Java_wjy_geridge_com_testndk_jni_JniUtils_getCountJNI
(JNIEnv *env, jobject clazz,jint x,jint y){
return x+y;
}
jstring,jint是 Java語言中的String、int類型, 方法名格式爲 : Java_完整包名類名_方法名();
-- env參數 : 代表的是Java環境, 通過這個環境可以調用Java裏面的方法;
-- clazz參數 : 調用C語言方法的對象, thiz對象表示當前的對象, 即調用JNI方法所在的類;
最後在Android中調用getCountJNI方法
textView.setText(JniUtils.getCountJNI(8,9)+"");
運行如果有下面的錯誤
是因爲你先操作的Terminal終端沒退出來有兩種解決辦法1.你敲回原工程路徑,如本人的如下
cd E:\ndk\TestNdk
2.另一種方式是重啓IDE,這樣你再整的時候就可以了
關於Android Studio中配置NDK開發環境 :http://blog.csdn.net/yywan1314520/article/details/52076132
進一步研究JNI : http://blog.csdn.net/quan648997767/article/details/65444138