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