zoukankan      html  css  js  c++  java
  • android Studio gradle so的加载

    最近在使用Android Studio开发android项目,我的项目是由gradle构建的,gradle的优势文档上有说明,当你不断使用中,我越来越发现,太TMD方便啦,优势大大的明显。

    打包,功能模块多实现切换等等吧,在这里感谢Nick Xu的引导和帮助。

    回到正题,如何加载so库。以前的项目都没有使用jni比较简单的项目,最近由于工作原因,感觉切换成Android studio基于gradle构建项目能够很好的解决公司内多款产品的问题,所所以开始研究如何加载so库,发现这方面的资料很少,多次尝试终于成功啦,在此笔记。(如有错误,请留言纠正)。

    一:so库应该放在那里呢?


    │app

    │   |── libs

    │   │  ├── armeabi

    │   │   ├── libtest.so

    如上图,我这里放在libs中,注意在build.gradle需要配置这个路径为libs。

    二:如果书写build.gradle?

        task copyNativeLibs(type: Copy) {
            from fileTree(dir: 'libs', include: '**/*.so' )  into  'build/native-libs'
        }
        tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }
    
        clean.dependsOn 'cleanCopyNativeLibs'
    
        tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
            pkgTask.jniDir file('build/native-libs')
        }

    注意:第二行中的dir为so库所在目录,我这里是libs,可根据具体情况自己配置。其他都不用动。


    在解决这个问题时,我尝试的几种方案:

    1.https://gist.github.com/khernyo/4226923#comment-812526

    这个是在stackoverflow.com中很多人推荐的。

    task copyNativeLibs(type: Copy) {
    	from(new File(project(':main').buildDir, 'native-libs')) { include '**/*.so' }
    	into new File(buildDir, 'native-libs')
    }
     
    tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }
     
    clean.dependsOn 'cleanCopyNativeLibs'
     
    tasks.withType(com.android.build.gradle.PackageApplicationTask) { pkgTask ->
    	pkgTask.jniDir new File(buildDir, 'native-libs')
    }


    注意下第二行,这里需要制定project,我不太清楚project应该设置成什么,尝试了几次,没有成功。

    这个方案和我使用的方案,主要差别就是指定project,如果您能够正确配置,请邮件我cczscq@163.com。谢谢。

    2。http://www.w3c.com.cn/%E5%9C%A8android-studio-%E4%B8%AD%E5%8A%A0%E5%85%A5jar-%E5%92%8C-so-%E6%96%87%E4%BB%B6

    这个方案看似很搞笑,我实验了几次,发现so的确copy到/data/data/XXXX/lib/中,当时在app中真正调用so库是还是加载失败,我估计原因可能是我哪里做的不对。

    http://rickosborne.org/blog/2013/07/build-and-use-libgdx-for-x86-in-android-studio/这个是一个开源的项目在android-stdio中使用的教程,它采取同样的方法,

    看来这个看似搞笑的方法也许真的能够奏效,很遗憾的是我没有能够成功,大家有谁使用这种方法解决soku加载问题,可以邮件我,同上,谢谢。

    使用gradle构建android项目的人并不是很多,中文资料质量大家都懂,在http://tools.android.com/tech-docs/new-build-system/user-guide中没有找到so相关的说明,

    在此总结下我的解决方案,希望能够对大家有所帮助。




  • 相关阅读:
    Xcode 10 storyBoard中控件区域位置修改
    使用WeexSDK,网络请求信任证书的问题
    真机调试包,解决xcode跑不了高版本iOS系统问题,及Deployment Target不显示高版本系统的问题
    vim进阶学习
    Linux中的inode(转载)
    Linux的文件权限
    远程连接Linux服务器
    WinSDK绘制文本
    (转载)Win32 SDK编程系列文章——菜单(快捷菜单)——动态加载
    (转载)Windows Socket五种I/O模型——代码全攻略
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3429301.html
Copyright © 2011-2022 走看看