android studio ndk配置和ndk开发

曾无好事来相访,赖尔高文一起予。这篇文章主要讲述android studio ndk配置和ndk开发相关的知识,希望能为你提供帮助。
配置开发环境:
1:下载ndk,导入android studio中。

android studio ndk配置和ndk开发

文章图片

 2:在项目中引入NDK
android studio ndk配置和ndk开发

文章图片

  3:在计算机path变量中导入NDK路径,在编译.h文件的时候会用到。
android studio ndk配置和ndk开发

文章图片

 
一:建立java的native方法,然后编译生成.class文件.
 
android studio ndk配置和ndk开发

文章图片

二:根据.class文件生成.h文件。
1:打开Terminal,然后进入APP目录下的main主目录。
2:输入命令。
android studio ndk配置和ndk开发

文章图片

3:生成.h文件,生成的jni文件夹在main文件夹下。
android studio ndk配置和ndk开发

文章图片

 三:根据.h文件编写.c文件。
 #include < string.h>
#include < jni.h>

jstring java_com_xingdongmei_media_FirstJni_getFromName(JNIEnv *env, jobject ob){

return (*env)-> NewStringUTF(env, "Hello from JNI !");
}

voidJava_com_xingdongmei_media_FirstJni_setAge(JNIEnv *env, jobject ob, jfloat age){
//printf("asdf!");
}

调用getFromName方法,返回"hello from JNI !"

四:在jni文件夹下新建application.mk文件和Android.mk文件,如下

Application.mk文件
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := x86 armeabi armeabi-v7a
APP_PLATFORM := android-8

Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= firstJni
LOCAL_SRC_FILES := FirstJni.c
include $(BUILD_SHARED_LIBRARY)

具体字段的作用:   -- LOCAL_PATH : 代表mk文件所在的目录;   -- include $(CLEAR_VARS) : 编译工具函数, 通过该函数可以进行一些初始化操作;   -- LOCAL_MODULE : 编译后的 .so 后缀文件叫什么名字;   -- LOCAL_SRC_FILES: 指定编译的源文件名称;   -- include $(BUILD_SHARED_LIBRARY) : 告诉编译器需要生成动态库;    五:进入jni文件夹,在terminal命令窗口输入ndk-build,然后就能在main文件夹下生成libs文件夹和obj文件夹。
android studio ndk配置和ndk开发

文章图片

 六:在build.gradle中配置.so文件的路径。我的为:
sourceSets.main {
jniLibs.srcDir ‘src/main/libs‘
}

七:运行结果:

android studio ndk配置和ndk开发

文章图片


八:常见错误

1:如果只有c/cpp文件,直接这样编译的话,会报错,这应该是android studio 在这种情况自动生成Android.mk 时的一个bug,见编译错误。
Error:Execution failed for task ‘:app:compileDebugNdk‘.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process ‘command ‘G:\android-ndk\android-ndk-r10\ndk-build.cmd‘‘ finished with non-zero exit value 2
解决方法:
在jni文件下建一个空的empty.c文件 编译运行即可。

2:找不到.so文件。
10-08 03:03:12.100 11948-11948/? E/dalvikvm﹕ dlopen("native/libfirstJni.so") failed: dlopen failed: library "native/libfirstJni.so" not found
10-08 03:03:12.11011948-11948/? E/CrashHandlerUtils﹕ java.lang.UnsatisfiedLinkError: dlopen failed: library "native/libfirstJni.so" not found
解决方法:
  在项目的APP目录下的build.gradle里面加上.so上级目录文件的路径。
我的.so文件上级目录结构如图:
android studio ndk配置和ndk开发

文章图片

我的build.gradle配置的.so文件路径:
【android studio ndk配置和ndk开发】sourceSets.main {
jniLibs.srcDir ‘src/main/libs‘
}


    推荐阅读