文档章节

在android studio下配置gradle用ndk-build和ndk-gbd编译调试JNI

shzwork
 shzwork
发布于 06/29 18:18
字数 1469
阅读 20
收藏 0

因为要在旧版android在做一些工作。所以做用到了它。目标平台是:android api 10和armv6. 开发环境是:AS 版本2.3.2; SDK版配android 2.3.3(api10); NDK版本android-ndk-r10e这个必需,后面版本对armv6有点问题,我试的r13b就是gdbserv er不运行,好似这些版本从armv7开始了.  gradle的版本关系不大,我用的是4.7.

 

这些基本的开改环境安装好就开始配成开发JNI 本地代码的三种方法三有:直接用gradle的任务与NDK中的ndk-build和ndk-gbdl; 用Gradle_Experimental,这个也是用ndk-build,做了一些gradle的工具,但现在有更新的方法不建议用这个。 新工程用CMAKE与LLDB吧,LLDB因为没找到armv6的编译版本,我自已双不想去编译,LLDB是LLVM下的一个工具,其工程和android源码有点类似,要整体下了配置编译,只编译一部分,大约问题会太多,我就没去试。用gdb原生工具适应度宽一点。配本上是LINUX的地方都可用。

第一步,生成新工程,

在生成新工程时选择支持C++,别的基本不用动,这样配出来的基本上就是用CMAKE开发的环境。我生成新工程时,因为AS网上下东西就卡死了,我断网后,AS不下东西,就生成新工程通过了。然后手工在文件中改配。我生成的代码中带一个简单的C调用。就用它做配置测试。

先用CMAKE有的环境做了测试。基本上不用动就是编译通过的,如果出小问题网上找一下吧。因为每个人的开发环境可能不一样。这里先试一下CMAKE, Cmake在android-ndk-r10e下是不能用的。我用的是android-ndk-r13b,在armv6可运行,但因LLDB-server不运行,所以不能调试。

第二步,在gradle配置中去CMAKE, 配ndk-build。相关的文件是gradle.properties,这里加入

 

#for NDK-build
Android.useDeprecatedNdk=true
主要的改动在这里build.gradle(APP)这个是APP 目录下的。注释去CMAKE相关部分。

 

/*externalNativeBuild {
     cmake {
         cppFlags "-frtti -fexceptions"
     }
 }
 ndk {
     // Specifies the ABI configurations of your native
     // libraries Gradle should build and package with your APK.
     abiFilters 'armeabi'
 }*/
/*externalNativeBuild {
    cmake {
        path "CMakeLists.txt"
    }
}*/
整个文件出来吧

 

apply plugin: 'com.android.application'
 
android {
    compileSdkVersion 25
    buildToolsVersion "28.0.1"
    defaultConfig {
        applicationId "com.home.ququ.videotest"
        minSdkVersion 9
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        /*externalNativeBuild {
             cmake {
                 cppFlags "-frtti -fexceptions"
             }
         }
         ndk {
             // Specifies the ABI configurations of your native
             // libraries Gradle should build and package with your APK.
             abiFilters 'armeabi'
         }*/
        //gradle test task
 
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            jniDebuggable true
            debuggable true
        }
        //for NDK-build maked .so \Videotest\app\src\main\jniLibs
        sourceSets {
            main {
                jni.srcDirs = []
                //jniLibs.srcDirs = ['libs']
            }
        }
    }
    /*externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }*/
}
 
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
}
task hello {
    println 'Hello world!'
}
//for NDK-build
task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') {
    commandLine 'D:\\android-ndk\\android-ndk-r10e\\ndk-build.cmd ',//这里本地ndk的路径
            'NDK_DEBUG=1',
            'NDK_PROJECT_PATH=D:\\androidproject\\Videotest\\app\\src\\main\\',
            'NDK_LIBS_OUT=D:\\androidproject\\Videotest\\app\\src\\main\\jniLibs',
            'APP_BUILD_SCRIPT=./src/main/jni/Android.mk',
            'NDK_APPLICATION_MK=./src/main/jni/Application.mk'
}
//when build do it
preBuild.dependsOn ndkBuild
task hello是我写gralde任短务时做测试。命令行调用任务是在build.gradle同目录下,

D:\Android-Studio\gradle\gradle-4.7\bin\(gradle的安装目录)gradle hello

初次调用,要下一些东西,有点慢。再调用就快了。

ndk-build的编译工作主要是通过任务ndkbuild. 我是用命令行调好了才在这里改的。最后一行指示build在在编译前调用这个任务。

 

preBuild.dependsOn ndkBuild
任务也可以直接用gradle ndkbuild在terminal下调用。把gradle的安装目录windows的环境变量就要不用写路径了。因为写了编译前调用这个路戏不加了。只是把ndk-guild.cmd加入windows的环境变量。因为后面的GDB是命令操作方式。

这样编译,运行吧,我的环境下没问题。到目示平台上一切正常。电脑开不起仿直器,有点旧了,好卡。

忘了一点,要写.mk文件的。默认生成的CPP文件在CPP 目录下。ndk-guild默认找到是JNI目录。这个可配,我是重配到JNI目录了。这个目录下要加两个.mk文件,用于编译指示。(CMAKE用的CMAKELISTS.txt配方不同)

Application.mk 

 

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI :=armeabi
Android.mk

 

LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=native-lib
LOCAL_SRC_FILES :=native-lib.cpp
LOCAL_LDLIBS +=-L$(SYSROOT)/usr/lib -lm -llog
include $(BUILD_SHARED_LIBRARY)
都是编译选项,有些是android 特有的。可以看一些关于mk的语法,如果只写一个库,就用这个无例子改一下名字就可。

 

可能遇到的错语,

1,run-as错误,这个有人说是修改一下NDK的脚本,其说法是有道理的,不过我一点点分析原因,是不调用是因为android的APP安装数据文件不对。我把它手机改对了,修改脚本可能也解决这个问题。修的是NDK-gdb的调试脚本,这个我没去试。直接改android的数据文件,指示run-as,调用时要找的数据项。

“我这里直接给DATA_DIR赋值为app目录:/data/data/com.umonistudio.tile。这步骤很重要,否则你会遇到run-as之类的错误,导致无法继续调试!”

2,app_process错语,这个把android的 /system/bin目录下的adb pull出一个到

(工程录)\app\src\main\obj\local\armeabi下就可以了。

4,ndk-gdb的调用脚本是我这个是旧版是PY写的。--verbose是打印执行命令的一些信息,方便找错。--nowait,让代码停在适当的位置。

ndk-gdb-py --verbose --start --nowait --adb D:\android-sdk\platform-tools\adb.exe

 

 
--------------------- 
作者:qqssbb123 
来源:CSDN 
原文:https://blog.csdn.net/qushaobo/article/details/81052680 
版权声明:本文为博主原创文章,转载请附上博文链接!

本文转载自:https://blog.csdn.net/qushaobo/article/details/81052680

shzwork
粉丝 11
博文 684
码字总数 10405
作品 0
厦门
私信 提问
Android:随笔——新的 NDK/JNI 调用方式

转载请标明地址 QuincySx: http://www.jianshu.com/p/c6108131ba0f 众所周知现在 Android 开发已经到了 Android Studio 的时代,那么 JNI 的调用方式也经过了好几代 在eclipse 时代就存在的...

quincy
2017/04/05
0
0
使用Android Studio 进行NDK开发和调试

尽管Android Studio已经越来越流行了,但很多人还是习惯于Eclipse或源码环境下开发JNI应用。个人认为使用Android Studio作NDK开发是必然趋势,所以本文将简单介绍如何在Android Studio上实现...

xiahuawuyu
2016/08/04
43
0
Android NDK 入门与实践

Android NDK 入门与实践 吴小龙同學2017-12-271 阅读 NDK NDK 是什么 NDK 全称 Native Development Kit,可以让您在 Android 应用中调用 C 和 C++ 代码的工具。 NDK 好处 1、NDK 可以生成 .s...

吴小龙同學
2017/12/27
0
0
Android JNI学习(二)——实战JNI之“hello world”

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头
2018/05/09
0
0
Android Studio之NDK环境搭建,so文件打包以及使用

本篇入门教程开发环境为mac + Android Studio + gradle 2.14.1,主要包含以下3块内容: NDK环境搭建 编写第一个JNI项目 打包出动态so文件,在其他项目中使用 一、NDK环境搭建 从Android Stu...

ljianbing
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Replugin借助“UI进程”来快速释放Dex

public static boolean preload(PluginInfo pi) { if (pi == null) { return false; } // 借助“UI进程”来快速释放Dex(见PluginFastInstallProviderProxy的说明) return PluginFastInsta......

Gemini-Lin
今天
4
0
Hibernate 5 的模块/包(modules/artifacts)

Hibernate 的功能被拆分成一系列的模块/包(modules/artifacts),其目的是为了对依赖进行独立(模块化)。 模块名称 说明 hibernate-core 这个是 Hibernate 的主要(main (core))模块。定义...

honeymoose
今天
4
0
CSS--属性

一、溢出 当内容多,元素区域小的时候,就会产生溢出效果,默认是纵向溢出 横向溢出:在内容和容器之间再套一层容器,并且内部容器要比外部容器宽 属性:overflow/overflow-x/overflow-y 取值...

wytao1995
今天
4
0
精华帖

第一章 jQuery简介 jQuery是一个JavaScript库 jQuery具备简洁的语法和跨平台的兼容性 简化了JavaScript的操作。 在页面中引入jQuery jQuery是一个JavaScript脚本库,不需要特别的安装,只需要...

流川偑
今天
7
0
语音对话英语翻译在线翻译成中文哪个方法好用

想要进行将中文翻译成英文,或者将英文翻译成中文的操作,其实有一个非常简单的工具就能够帮助完成将语音进行翻译转换的软件。 在应用市场或者百度手机助手等各大应用渠道里面就能够找到一款...

401恶户
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部