配置开发环境:

  1:下载ndk,导入android studio中。

  

 2:在项目中引入NDK

  

  3:在计算机path变量中导入NDK路径,在编译.h文件的时候会用到。

  

一:建立java的native方法,然后编译生成.class文件.

二:根据.class文件生成.h文件。

  1:打开Terminal,然后进入APP目录下的main主目录。

  2:输入命令。

  

  3:生成.h文件,生成的jni文件夹在main文件夹下。

  

 三:根据.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 !");
} void Java_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文件夹。

  

 六:在build.gradle中配置.so文件的路径。我的为:

  sourceSets.main {
   jniLibs.srcDir 'src/main/libs'
  } 七:运行结果:
  

  

八:常见错误

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.110 11948-11948/? E/CrashHandlerUtils﹕ java.lang.UnsatisfiedLinkError: dlopen failed: library "native/libfirstJni.so" not found

解决方法:

  在项目的APP目录下的build.gradle里面加上.so上级目录文件的路径。

   我的.so文件上级目录结构如图:

  

我的build.gradle配置的.so文件路径:

sourceSets.main {

    jniLibs.srcDir 'src/main/libs'
}

android studio ndk配置和ndk开发的更多相关文章

  1. Android Studio使用JNI和NDK进行开发

    想要学习一下在Android Studio中进行JNI的开发,文章挺多的,但是几乎没有一个完整的说明的,中间总是有一两步漏掉.分享技术就应该完整的让读者学会,藏着掖着不是君子所为.对于那些故意含糊过去 ...

  2. 使用Android Studio自带的NDK编译JNI

    /********************************************************************************** * 使用Android Stud ...

  3. Opencv4android的Android Studio项目配置及实例下载

    因为软件竞赛的项目会用到Opencv fo rAndroid,所以就研究了一下如何在Android Studio上配置Opencv4Android 环境概述: Android Studio 2.3 O ...

  4. 浅谈Kotlin(一):简介及Android Studio中配置

    浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 前言: 今日新闻:谷 ...

  5. android studio+grade配置构建

    Android 构建系统编译应用资源和源代码,然后将它们打包成可供您测试.部署.签署和分发的 APK.android Studio 使用 Gradle 这一高级构建工具包来自动化执行和管理构建流程,同 ...

  6. Android studio gradle配置完整版(转)

    Android studio gradle配置完整版https://my.oschina.net/u/1471093/blog/539075 Android studio 自定义打包apk名 - pe ...

  7. Opencv4android的Android Studio环境配置及项目实例下载

    因为软件竞赛的项目会用到Opencv for Android,所以就研究了一下如何在Android Studio上配置Opencv4Android 环境概述: Android Studio 2.3 O ...

  8. Android Studio最新配置教程2016

    http://blog.csdn.net/wen_demo 一.Android studio 基本简单介绍 1.Android studio和Eclipse的差别: 1.Studio中有Project ...

  9. Android Studio如何配置CURL指令一键打包apk上传至蒲公英

    Android Studio如何配置CURL指令一键打包apk上传至蒲公英 第一步:在所需要打包的模块build.gradle文件中加入如下代码: android{ buildTypes { //配置 ...

随机推荐

  1. Shell 编程基础之 && 与 ||

    一.引言 Shell 在执行某个命令的时候,会返回一个返回值,该返回值保存在 shell 变量 $? 中.当 $? == 0 时,表示执行成功:当 $? == 1 时,表示执行失败.有时候,下一条命令 ...

  2. Linux学习总结

    1.软链接和硬链接 ln 命令可用来创建硬链接或是符号链接.它的使用方式有两种. ln file link 用来创建硬链接 ln -s item link 用来创建符号链接,这里的item可以是文件也 ...

  3. Codeforces Round #FF(255) DIV2

    A - DZY Loves Hash 水题,开辟一个数组即可 #include <iostream> #include <vector> #include <algori ...

  4. Java底层实现 - CPU术语

    1.内存屏障(memory barriers)是一组处理器指令,用于实现对内存操作的顺序限制 2.缓冲行(cache line)CPU高速缓存中可以分配的最小存储单位.处理器填写缓存行时 会加载整个缓 ...

  5. Python强化训练笔记(六)——让字典保持有序性

    python的字典是一个非常方便的数据结构,使用它我们可以轻易的根据姓名(键)来找到他的成绩,排名等(值),而不用去遍历整个数据集. 例如:{'Lee': [1, 100], 'Jane': [2, ...

  6. [bzoj2463]谁能赢呢

    我们通过观察可以发现,当n为偶数时,一定可以转化为一种先手必胜态,即棋盘可以被骨牌所覆盖, 如果n是奇数,那么去掉一格后一定能被1*2的骨牌覆盖,但是先手从左上角走,就进入了这个S态(必胜态),那么和 ...

  7. (。・・)ノ~个人java学习随笔记录

    基本认识 1.编程思维 根据这几天的java学习,编写程序最重要的就是要有一个清晰的思路.语法上的错误可以跟随着不断的联系与学习来弥补,清晰的思维却只有自己来前期模仿,后面慢慢摸索形成一套属于自己的思 ...

  8. JavaScript对象属性(二)

    对象object  例子一: var car = { "wheels":4, "engines":1, "seats":5}; 例子二: v ...

  9. eclipse安装svn进行版本控制

    1)通过help->installsoft->svn->add 填入http://subclipse.tigris.org/update_1.8.x 选择这两个,等其下载 2)配置一 ...

  10. sql条件为空查询全部,不为空按条件查询以及多条件筛选查询。

    procedure queryLackLonOrLatTdCell(i_region_name varchar2, i_state varchar2) is begin select region_n ...