Android Studio下jni应用

来源:互联网 发布:阿里云 主页访问不了 编辑:程序博客网 时间:2024/06/05 17:29

Android Studio下jni应用

最近在将一个小应用从eclipse开发迁移到android studio,程序中有native代码实现,在eclipse是靠Android.mk这么个mk文件来组织编译的,但到android studio上就不行了,因其是靠gradle组织,所以makefile里的配置要转换为build.gradle里的语句(尽管实际上gradle也是组织一个mk文件),同时在迁移过程中遇到了一些问题,这里记录一下,以备后查。

Android的JNI开发主要有两中情况:一种是使用已经编译好的.so动态库;一种是使用c/c++源代码开发。下面分别介绍:

一、使用已经编译好的so

    这种情况比较件简单,只要把的.so文件放到相应的目录即可。如下:

         .[module_name]
         . . [src]
         . . .[main]
         . . . .[jniLibs]
         . . . . .[armeabi]
         . . . . .[armeabi-v7a]
         . . . . .[x86]
         . . . . .[mips]

注意 jniLibs 目录是放在 module 下面,在Android Studio中效果如下,这样编译之后so就会被自动打包进apk,代码中直接 loadLibrary即可了:

1 String libName = "helloNDK"; // 库名, 注意没有前缀lib和后缀.so  2 System.loadLibrary( libName );

 

二、使用C/C++源码

1 r9d以上版本NDK

首先确保自己的NDK版本在r9d以上,目前最新可以拿到的是r10,下载地址:

http://tools.android-studio.org/

感谢 Android Studio中文组的无私奉献。

如果低于r9d版本,Android studio 下ndk编译会出现  No rule to make target 的错误。 

2 配置 ndk.dir

在 local.properties 添加如下配置:

     sdk.dir=/path/to/android-sdk

     ndk.dir=/path/to/android-ndk

黄色部分修改为你本机的实际情况,如我的是:

 

sdk.dir=D\:\\android-sdk-windowsndk.dir=D\:\\android-ndk

 

 

 

3 app下的build.gradle配置NDK模块

复制代码
复制代码
android {    compileSdkVersion 19  buildToolsVersion "20.0.0"  defaultConfig {    applicationId "com.example.ndksample"    minSdkVersion 9    targetSdkVersion 19    versionCode 1    versionName "1.0"    ndk {      moduleName "helloNDK" // <-- This is the name of my C++ module!    }  }  // ... more gradle stuff here ...} // end of android section
复制代码
复制代码

ndk 还可以配置更多选项,如下:

复制代码
复制代码
ndk {    moduleName "myEpicGameCode"  cFlags "-DANDROID_NDK -D_DEBUG DNULL=0"   // Define some macros  ldLibs "EGL", "GLESv3", "dl", "log"       // Link with these libraries! 在这里添加你原先在makefile里ldlibs所链接的库  stl "stlport_shared"                      // Use shared stlport library}
复制代码
复制代码

 

 

4 添加C/C++源代码

默认情况下,你需要把C/C++源代码放在 [module]/src/main/jni/ 路径下。效果如下图所示:

当然,也可以自定义源代码路径:

复制代码
复制代码
android {  // .. android settings ..  sourceSets.main {      jni.srcDirs 'src/main/source'  }}
复制代码
复制代码

 

 

这里有一点需要注意,目前windows上android studio 下ndk编译有一个bug,就是如果你的源文件(.C和.cpp文件,不算.h)只有一个,那么最后也会有编译error,目前google还没有修复,暂时的解决办法是,新建一个空的.c文件放在那里,就可以编译通过了。。。。有点奇葩!!

 

5 分平台配置编译

这一步不是必须的,你可以根据需要,对各个平台进行不同的编译配置,可以设置覆盖前面的编译选项(例如 cFlags )。例如你只想编译指定平台的.so,而不是所有的平台。如下:

复制代码
复制代码
android {  // .. android settings ..  productFlavors {    x86 {      ndk {        abiFilter "x86"      }    }    arm {      ndk {        abiFilter "armeabi-v7a"      }    }    mips {      ndk {        abiFilter "mips"      }    }  }} // android
复制代码
复制代码

 

 

参考链接:

http://www.race604.com/android-studio-with-ndk/?utm_source=tuicool

http://blog.csdn.net/sodino/article/details/41946607

http://www.dewen.io/q/17530/Android+Studio+NDK%E5%BC%80%E5%8F%91%E7%BC%96%E8%AF%91%E9%93%BE%E6%8E%A5%E5%87%BA%E9%94%99%E9%97%AE%E9%A2%98

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 38度5算高烧吗怎么办 刚发现怀孕不想要怎么办 被蜥蜴咬出血了怎么办 去韩国打工签证怎么办多么钱 厕所堵了怎么办有妙招 蹲式厕所老是堵怎么办 下蹲式厕所堵了怎么办 蹲的厕所堵住了怎么办 厕所通了又堵怎么办 蹲式厕所经常堵怎么办 厕所下水管堵了怎么办 厕所堵了水满了怎么办 拉屎把厕所堵了怎么办 厕所堵了不下水怎么办 坐厕所堵了怎么办妙招 火车上丢了东西怎么办 网购的东西丢了怎么办 在酒店丢了东西怎么办 我好懒不想工作怎么办 被宠物刺猬咬了怎么办 被老鼠咬了怎么办打针 手指被老鼠咬了怎么办 孕妇被老鼠咬了怎么办 耳朵里面一直嗡嗡响怎么办 把语言栏删了怎么办 乐视会员到期了怎么办 预提费用取消了怎么办 小学生上课注意力不集中怎么办 工商抽查到你了怎么办 拿到商调函后该怎么办 苹果7p掉水里了怎么办 苹果7屏幕进水了怎么办 苹果5s掉进水里怎么办 苹果5s无法开机怎么办 苹果手机充不了电怎么办 苹果5s掉了怎么办 苹果6手机掉水里了怎么办 苹果5s关机丢了怎么办 苹果5s发热严重怎么办 手机开不开机了怎么办 苹果6基带坏了怎么办