日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

The new NDK support in Android Studio 1.3

發(fā)布時間:2025/3/15 Android 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 The new NDK support in Android Studio 1.3 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文地址: http://ph0b.com/new-android-studio-ndk-support/


During Google I/O 2015,?end of May, Google announced a new support for the NDK by Android Studio 1.3, integrating Jetbrains CLion capabilities, and the Android gradle plugin. This support has been released only in July, and while it’s really promising, it’s still in heavy development.

The new NDK support requires the use of Android Studio 1.3 RC1+/2.0+ and the android gradle-experimental plugin.?This article is for those who are willing?to give it a try.?If you’re looking into the NDK support while using the gradle(-stable) plugin, you can check this?older (but still up-to-date) article on the NDK and Android Studio.

article last updated on?2016/01/26?(gradle-experimental 0.6.0-alpha7 – Android Studio 2.0 preview 7, support for native dependencies!)

Migrating to the gradle-experimental plugin and the new com.android.model.*

The gradle-experimental 0.6.0-alpha7 requires using gradle-2.10. Start by setting?it from your project settings:

Or?inside?gradle/wrapper/gradle-wrapper.properties:

gradle-wrapper.properties distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
1 distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip

Then,?change the reference to the android gradle plugin to the new gradle-experimental plugin, from ./build.gradle:

// Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript {repositories {jcenter()}dependencies {classpath 'com.android.tools.build:gradle-experimental:0.6.0-alpha7'} }
1 2 3 4 5 6 7 8 9 10 // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ????repositories { ????????jcenter() ????} ????dependencies { ????????classpath 'com.android.tools.build:gradle-experimental:0.6.0-alpha7' ????} }

The gradle-experimental plugin introduces a change in the DSL. The android plugins com.android.model.application?and?com.android.model.library are replacing the former?com.android.application and?com.android.library plugins.

You need to migrate your apps and libs build.gradle files to use these new plugins. Here is an example of the same configuration, with the old DSL (top) and the new (bottom):

old DSL Java apply plugin: 'com.android.application'android {compileSdkVersion rootProject.ext.compileSdkVersionbuildToolsVersion rootProject.ext.buildToolsVersiondefaultConfig {applicationId "com.ph0b.example"minSdkVersion 15targetSdkVersion 23versionCode 4versionName "1.0.1"ndk {moduleName "mymodule"ldLibs "log"stl "gnustl_static"cFlags "-std=c++11 -fexceptions"}}signingConfigs {release {storeFile file(STORE_FILE)storePassword STORE_PASSWORDkeyAlias KEY_ALIASkeyPassword KEY_PASSWORD}}buildTypes {release {minifyEnabled trueshrinkResources trueproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.txt'signingConfig signingConfigs.release}debug {jniDebuggable true}} }dependencies {compile 'com.android.support:support-v4:23.1.1'compile fileTree(dir: 'libs', include: ['*.jar']) }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 apply plugin: 'com.android.application' android { ????compileSdkVersion rootProject.ext.compileSdkVersion ????buildToolsVersion rootProject.ext.buildToolsVersion ????defaultConfig { ????????applicationId "com.ph0b.example" ????????minSdkVersion 15 ????????targetSdkVersion 23 ????????versionCode 4 ????????versionName "1.0.1" ????????ndk { ????????????moduleName "mymodule" ????????????ldLibs "log" ????????????stl "gnustl_static" ????????????cFlags "-std=c++11 -fexceptions" ????????} ????} ????signingConfigs { ????????release { ????????????storeFile file(STORE_FILE) ????????????storePassword STORE_PASSWORD ????????????keyAlias KEY_ALIAS ????????????keyPassword KEY_PASSWORD ????????} ????} ????buildTypes { ????????release { ????????????minifyEnabled true ????????????shrinkResources true ????????????proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.txt' ????????????signingConfig signingConfigs.release ????????} ????????debug { ????????????jniDebuggable true ????????} ????} } dependencies { ????compile 'com.android.support:support-v4:23.1.1' ????compile fileTree(dir: 'libs', include: ['*.jar']) }

new DSL Java apply plugin: 'com.android.model.application'model {android {compileSdkVersion = rootProject.ext.compileSdkVersionbuildToolsVersion = rootProject.ext.buildToolsVersiondefaultConfig.with {applicationId = "com.ph0b.example"minSdkVersion.apiLevel = 15targetSdkVersion.apiLevel = 23versionCode = 4versionName = "1.0.1"}}android.ndk {moduleName = "mymodule"ldLibs.addAll(['log'])cppFlags.add("-std=c++11")cppFlags.add("-fexceptions")stl = 'gnustl_shared'}android.signingConfigs {create("release") {keyAlias = KEY_ALIASkeyPassword = STORE_PASSWORDstoreFile = file(STORE_FILE)storePassword = KEY_PASSWORD}}android.buildTypes {release {shrinkResources = trueuseProguard = trueproguardFiles.add(file('proguard-rules.txt'))signingConfig = signingConfigs.release}} }dependencies {compile 'com.android.support:support-v4:23.1.1'compile fileTree(dir: 'libs', include: ['*.jar']) }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 apply plugin: 'com.android.model.application' model { ????android { ????????compileSdkVersion = rootProject.ext.compileSdkVersion ????????buildToolsVersion = rootProject.ext.buildToolsVersion ???? ????????defaultConfig.with { ????????????applicationId = "com.ph0b.example" ????????????minSdkVersion.apiLevel = 15 ????????????targetSdkVersion.apiLevel = 23 ????????????versionCode = 4 ????????????versionName = "1.0.1" ????????} ????} ????android.ndk { ????????moduleName = "mymodule" ????????ldLibs.addAll(['log']) ????????cppFlags.add("-std=c++11") ????????cppFlags.add("-fexceptions") ????????stl = 'gnustl_shared' ????} ????android.signingConfigs { ????????create("release") { ????????????keyAlias = KEY_ALIAS ????????????keyPassword = STORE_PASSWORD ????????????storeFile = file(STORE_FILE) ????????????storePassword = KEY_PASSWORD ????????} ????} ????android.buildTypes { ????????release { ????????????shrinkResources = true ????????????useProguard = true ????????????proguardFiles.add(file('proguard-rules.txt')) ????????????signingConfig = signingConfigs.release ????????} ????} } dependencies { ????compile 'com.android.support:support-v4:23.1.1' ????compile fileTree(dir: 'libs', include: ['*.jar']) }

To summarize the changes required: all the android declarations are now going under?model {}, the?various assignments now have to use explicitly ‘=‘, collections?must not?be overwritten,?use .removeAll(), .add(), .addAll() instead. Variants and other new configurations have?to be declared using ‘create()‘. Properties like xxxSdkVersion have?changed to xxxSdkVersion.apiLevel.

As it’s experimental, you can expect regular changes around the DSL across versions. For example, minifyEnabled has been changed to isMinifyEnabled,?then to minifyEnabled again, and now there is also?useProguard;?jniDebuggable has been changed to isJniDebuggable and then to ndk.debuggable (and is now set by default for debug builds).

You’ll notice that with both DSLs, there is a configuration block for the NDK. This is the place where you’re supposed to set all the NDK configuration when using gradle, as by default Android.mk and Application.mk files will be simply ignored.

Enjoying the new C++/NDK support in Android Studio

To activate the C++/NDK support inside Android Studio, you only need to have?a NDK module declared inside your application or library build.gradle:

Java model {//...android.ndk {moduleName = "mymodule"} }
1 2 3 4 5 6 model { ?? //... ?? android.ndk { ????????moduleName = "mymodule" ?? } }

Once it’s done, you can go to your Java sources, create a method prefixed with the native keyword, and press ALT+Enter to generate its C or C++ implementation:

Yes, it’s that magical

The implementation will be added under ‘jni‘, inside an existing cpp file if there is one, or inside a new one.

In order to get started with NDK modules, you can have a look at all the samples that have been ported to use the new gradle-experimental plugin:?https://github.com/googlesamples/android-ndk

Here is everything you can configure for a ndk module:

Java android.ndk {moduleName = "mymodule"ldLibs.addAll(['log'])ldFlags.add("")toolchain = "clang"toolchainVersion = "3.9"abiFilters.add("x86")CFlags.add("")cppFlags.add("")debuggable = falserenderscriptNdkMode = falsestl = "system"platformVersion = 15}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 ????android.ndk { ????????moduleName = "mymodule" ????????ldLibs.addAll(['log']) ????????ldFlags.add("") ????????toolchain = "clang" ????????toolchainVersion = "3.9" ????????abiFilters.add("x86") ????????CFlags.add("") ????????cppFlags.add("") ????????debuggable = false ????????renderscriptNdkMode = false ????????stl = "system" ????????platformVersion = 15 ????}

Debugging a NDK project

In order to get?the debug capabilities of AS, create and use a new Run/Debug configuration from the “Android Native” default. While it was possible to use GDB in Android Studio 1.3, now only the LLDB backend is available.

Use it with?your debug variant, which will have ndk.debuggable flag set to true by default.

Going further with the?NDK with Android Studio

Many advanced features, such as the ability to have dependencies between native libraries, reuse prebuilts,?tune specific toolchain options and having dynamic version codes while still having a project in a good shape is a bit complex, as the gradle-experimental plugin is still undergoing a lot of improvements across versions.

Getting the APP_PLATFORM right

When you’re building a NDK module, the android platform you’re compiling it against?is a quite?important setting, as it basically determines the minimum platform your module will be guaranteed to run on.

With earlier versions than gradle-experimental:0.3.0-alpha4, the chosen platform was the one set as compileSdkVersion. Fortunately with subsequent releases, you can now set android.ndk.platformVersion independently, and you should make it the same as your minSdkVersion.

Using?external?libraries and separate modules

with sources

If you have access to your 3rd party libraries source code, you can embed it?into your project and make it?statically compile?with your code.

There?is an example of this with the native_app_glue library from the NDK, inside the native-activity sample. For example, you can?copy the library sources inside a subfolder inside your?jni folder and add a reference to its directory so the includes are properly resolved:

android.ndk {//...cppFlags += "-I${file("src/main/jni/native_app_glue")}".toString()}
1 2 3 4 ????android.ndk { ????????//... ????????cppFlags += "-I${file("src/main/jni/native_app_glue")}".toString() ????}

with sources in different modules

Now with 0.6.0-alpha7 version, you can finally have clean dependencies between native libraries, by setting the dependency on another module from your model:

build.gradle Java android.sources {main {jni {dependencies {project ":yourlib" buildType "release" productFlavor "flavor1" linkage "shared"}}}}
1 2 3 4 5 6 7 8 9 ????android.sources { ????????main { ????????????jni { ????????????????dependencies { ????????????????????project ":yourlib" buildType "release" productFlavor "flavor1" linkage "shared" ????????????????} ????????????} ????????} ????}

In order to keep debugging working, you may have to edit your app-native run configuration, to add?/build/intermediates/binaries/release/obj/[abi]?to the?symbol directories.

with native prebuilts

This technique works with static and shared prebuilts too! Inside your model, you’ll have to add a?“l(fā)ib repository”:

build.gradle Java repositories {libs(PrebuiltLibraries) {yourlib {headers.srcDir "src/main/jni/prebuilts/include"binaries.withType(SharedLibraryBinary) {sharedLibraryFile = file("src/main/jni/prebuilts/${targetPlatform.getName()}/libyourlib.so")}}}}
1 2 3 4 5 6 7 8 9 10 ????repositories { ????????libs(PrebuiltLibraries) { ????????????yourlib { ????????????????headers.srcDir "src/main/jni/prebuilts/include" ????????????????binaries.withType(SharedLibraryBinary) { ????????????????????sharedLibraryFile = file("src/main/jni/prebuilts/${targetPlatform.getName()}/libyourlib.so") ????????????????} ????????????} ????????} ????}

And declare the?dependency on this library:

build.gradle Java android.sources {main {jni {dependencies {library "yourlib" linkage "shared" }}}}
1 2 3 4 5 6 7 8 9 ????android.sources { ????????main { ????????????jni { ????????????????dependencies { ????????????????????library "yourlib" linkage "shared" ????????????????} ????????????} ????????} ????}

Shared linkage is the default, but?of course you can use static prebuilts by using a static linkage, and declaring StaticLibraryBinary/staticLibraryFile variables.

Multiple APKs

When you publish multiple APKs (per architecture, per density, etc), you have to give them different version?Version Codes. I couldn’t find a way to do it with the current DSL, neither when using splits or abiFilters and flavors. If you do see a way, plese contact me and I’ll add it there. For now, I would advise to go back using the stable gradle plugin.

The good news is you can mix use of the stable gradle plugin, and the new experimental one, even while keeping debug features working! Please follow this gist.

Using Android.mk/Application.mk

If the built-in gradle support isn’t suitable?to your needs, you can get rid of it, while keeping the goodness of Android Studio C++ editing.

Declare a module that correctly represents your configuration, as this will help AS to correctly resolve all the symbols you’re using and keep the editing?capabilities:

android.ndk { // keeping it to make AS correctly support C++ code editingmoduleName = "mymodule"ldLibs.add('log')cppFlags.add( "-std=c++11")cppFlags.add("-fexceptions")cppFlags.add("-I${file("src/main/jni/prebuilts/include")}".toString())stl = 'gnustl_shared'}
1 2 3 4 5 6 7 8 android.ndk { // keeping it to make AS correctly support C++ code editing ????????moduleName = "mymodule" ????????ldLibs.add('log') ????????cppFlags.add( "-std=c++11") ????????cppFlags.add("-fexceptions") ????????cppFlags.add("-I${file("src/main/jni/prebuilts/include")}".toString()) ????????stl = 'gnustl_shared' ????}

Then, set the jni sources location to a non-existing folder, and the jniLibs location to libs, the default directory in which ndk-build will put the generated libs:

android.sources{main.jni {source {srcDirs.removeAll()srcDirs.add('src/main/none')}}main.jniLibs {source {srcDirs.add('src/main/libs')}}}
1 2 3 4 5 6 7 8 9 10 11 12 13 ????android.sources{ ????????main.jni { ????????????source { ????????????????srcDirs.removeAll() ????????????????srcDirs.add('src/main/none') ????????????} ????????} ????????main.jniLibs { ????????????source { ????????????????srcDirs.add('src/main/libs') ????????????} ????????} ????}

This way, you can call ndk-build(.cmd) yourself from the root of your src/main directory, that will use your usual Android.mk/Application.mk files under the jni folder. Your libs will be generated inside libs/<ABI>?as usual and get included inside your APK.

You can also add?this call to ndk-build inside your gradle configuration:

build.gradle Java import org.apache.tools.ant.taskdefs.condition.Os//...// call regular ndk-build(.cmd) script from app directory task ndkBuild(type: Exec) {if (Os.isFamily(Os.FAMILY_WINDOWS)) {commandLine 'ndk-build.cmd', '-C', file('src/main').absolutePath} else {commandLine 'ndk-build', '-C', file('src/main').absolutePath} }tasks.withType(JavaCompile) {compileTask -> compileTask.dependsOn ndkBuild }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import org.apache.tools.ant.taskdefs.condition.Os //... // call regular ndk-build(.cmd) script from app directory task ndkBuild(type: Exec) { ????if (Os.isFamily(Os.FAMILY_WINDOWS)) { ????????commandLine 'ndk-build.cmd', '-C', file('src/main').absolutePath ????} else { ????????commandLine 'ndk-build', '-C', file('src/main').absolutePath ????} } tasks.withType(JavaCompile) { ????compileTask -> compileTask.dependsOn ndkBuild }

Additional Resources

  • official samples
  • gradle-experimental user guide

Published by

Xavier Hallade

Software Engineer working at Intel Software and Service Group (SSG) in Paris, France. Google Developer Expert for Android.Helping developers to make a better use of Intel-based platforms, with a focus on the Android NDK. View all posts by Xavier Hallade

Posted on August 17, 2015 Categories Android Tags Android, Android Build System, Android Studio, gradle, NDK

37 thoughts on “The new NDK support in Android Studio”

  • Nelson Glauber says: August 25, 2015 at 7:37 pm

    Perfect tutorial! Thanks Xavier!
    Any idea when this plugin becomes will be officially released?

    Reply
  • Xavier Hallade says: August 26, 2015 at 9:52 am

    Thanks Nelson!
    Everything is already released and advertised as “the official way”, even if the gradle-experimental plugin is.. experimental.
    I don’t know when the experimental plugin and the new DSL will replace the current stable ones.
    I’d expect this to happen around the Marshmallow release timeframe.

    Reply
  • John Anderson says: September 2, 2015 at 12:59 am

    Thanks for the tutorial! I tried following the “Using Android.mk/Application.mk” and was hoping to see my C++ source files in Android Studio but when I set my jni.srcDirs to a non-existent folder the sources are removed from my project. Do you know if there is there a way to keep the sources in Android Studio for editing/debugging but have the build done by ndk-build?

    Reply
  • Alex Cohn says: September 3, 2015 at 11:01 pm

    To fall back to Android.mk/Application.mk, I prefer to provide the actual jni directory (or directories), but disable the build step:

    tasks.all {
    task -> if (task.name.contains('compileDebugNdk') || task.name.contains('compileReleaseNdk')) task.enabled = false
    }

    Reply
  • Steve Madsen says: September 6, 2015 at 5:34 pm

    I wanted to try to use Android.mk/Application.mk as outlined above, so downloaded the new samples from:
    https://github.com/googlesamples/android-ndk
    and modified the Teapot sample as follows:
    * Copied Android.mk and Application.mk from the legacy sample project
    * Added task ndkBuild(type: Exec) as described on your legacy ndk page
    * Defined NDK_APP_OUT and NDK_APP_LIBS_OUT in Application.mk (because new lib location is e.g.
    app/build/intermediates/binaries/debug/arm7/lib/armeabi-v7a)

    Anyway, by setting those values the .apk is built automatically (ndk-build is called as usual, no manual command line required) and runs OK, but C++ debugging doesn’t work; by restoring android.sources.main.jni.source.srcDirs so it points to the actual jni folder (and commenting out the ndk-build task) C++ debugging works properly in Android Studio.

    Any ideas what I’m doing wrong? Thank you

    Reply
  • Francesco says: September 8, 2015 at 3:04 pm

    Hey Xavier.
    Nice tutorial. Thanks for that!
    We are currently struggling around with getting a referenced JNI Android library module inside the same Android Studio project debuggable in another Android application module. We currently are using “compile project()” to reference the JNI lib. You are already mentioning that debugging external libraries are not supported yet. You solution would be to copy the source code into some folder of the actual Android module. We really don’t want to copy the files to achieve that. Isn’t there any other solution that come to your mind?

    Reply
  • Steve Madsen says: September 14, 2015 at 10:10 pm

    I tried your updated instructions for using Android.mk/Application.mk with experimental gradle (goal is C++ debugging in Android Studio to retire Eclipse). But, getting this error:

    Error: duplicate files during packaging of APK /app/build/outputs/apk/app-arm7-debug-unaligned.apkPath in archive: lib/armeabi-v7a/gdb.setupOrigin 1: /app/build/intermediates/binaries/debug/arm7/lib/armeabi-v7a/gdb.setupOrigin 2: /app/src/main/libs/armeabi-v7a/gdb.setup You can ignore those files in your build.gradle:android {packagingOptions {exclude 'lib/armeabi-v7a/gdb.setup'}}
    1 2 3 4 5 6 7 8 9 10 Error: duplicate files during packaging of APK /app/build/outputs/apk/app-arm7-debug-unaligned.apk Path in archive: lib/armeabi-v7a/gdb.setup Origin 1: /app/build/intermediates/binaries/debug/arm7/lib/armeabi-v7a/gdb.setup Origin 2: /app/src/main/libs/armeabi-v7a/gdb.setup You can ignore those files in your build.gradle: android { ??packagingOptions { ????exclude 'lib/armeabi-v7a/gdb.setup' ??} }

    Would prefer to not have to use workarounds if possible, do you have any ideas? (Thank you again for maintaining these pages, they are very useful resource)

    Reply
  • Steve Madsen says: September 14, 2015 at 10:22 pm

    P.S.
    Tried adding this to app/build.gradle but to no avail:

    android.packagingOptions {excludes += ['src/main/libs/armeabi-v7a/gdb.setup']}
    1 2 3 ????android.packagingOptions { ????????excludes += ['src/main/libs/armeabi-v7a/gdb.setup'] ????}

    Reply
  • Steve Madsen says: September 14, 2015 at 11:34 pm

    P.S.2
    By changing jniLibs I avoid the duplicate error above, and the app builds and runs — but no C++ debugging in android studio (breakpoints ignored, though the pause/start buttons in the Debugger window work)

    And of course, the build variant shouldn’t be hardcoded like this (debug, arm should be replaced by variables)

    jniLibs {source {//srcDirs = ['src/main/libs']srcDirs = ['build/intermediates/binaries/debug/arm7/lib/armeabi-v7a']}}
    1 2 3 4 5 6 jniLibs { ????????????????source { ????????????????????//srcDirs = ['src/main/libs'] ????????????????????srcDirs = ['build/intermediates/binaries/debug/arm7/lib/armeabi-v7a'] ????????????????} ????????????}

    Reply
  • Steve Madsen says: September 20, 2015 at 11:19 pm

    Having troble setting main.jniLibs.source.srcDirs as instructed above — using this:

    jniLibs {source {srcDirs = ['src/main/libs']}}
    1 2 3 4 5 jniLibs { ????????????????source { ????????????????????srcDirs = ['src/main/libs'] ????????????????} ????????????}

    I get this error:

    Execution failed for task ':app:packageArm7Debug'. > Failed to add {project_path}/app/build/intermediates/binaries/debug/arm7/lib/armeabi-v7a/gdb.setup
    1 2 Execution failed for task ':app:packageArm7Debug'. > Failed to add {project_path}/app/build/intermediates/binaries/debug/arm7/lib/armeabi-v7a/gdb.setup

    For some reason the gdb.setup is problematic, an attempt is usually made to install it twice resulting in some sort of “duplicate” error.

    Reply
  • Koki says: December 16, 2015 at 6:09 pm

    Hi,
    This is really nice tutorial.
    I wonder if there has been any findings on this issue.
    I’ve been facing exactly the same message, i.e. “Failed to add /……./gdb.setup”, and I can’t find any other site mentioning this message.
    My setup is gradle 2.6 with experimental-plugin 0.3.0-alpha7 targeting native debugging.

    Reply
  • Steve Madsen says: October 7, 2015 at 7:11 am

    Just a followup to a previous comment: I think some of the problems I was having may have been due to attempting to include the (incompatible?)

    'NDK_DEBUG=1'
    1 'NDK_DEBUG=1'

    switch to ndk-build e.g.

    commandLine 'ndk-build', 'NDK_DEBUG=1', '-C', file('src/main').absolutePath
    1 commandLine 'ndk-build', 'NDK_DEBUG=1', '-C', file('src/main').absolutePath

    (Still can’t get breakpoints to work, just start/pause control from Android Studio debugger panel)

    Reply
  • Xavier Hallade says: October 19, 2015 at 4:38 pm

    Hi Steve,
    I’ve got the same troubles to get NDK debugging working with AS 1.4/1.5 and the gradle-experimental plugin while keeping Makefiles.
    It was working for me before 1.4 release when using GDB backend, which doesn’t seem to be available anymore.

    Reply
  • Ronnie Erickson says: November 19, 2015 at 8:03 pm

    Any idea how to get around this? I am dealing with trying to move a really complex build that uses a lot of common code for other platforms over to Android Studio. I can build it fine with using my own Android.mk/Application.mk like I did with ADT. But I can’t build with the experimental gradle because I can’t find a way to define all of the common files that are needed that sit outside of the jni directory. Any thoughts on how I could build about 300 cpp files in multiple directories that are not inside the jniSource directory? In addition to that, our make files pull in some static libraries that we use.

    I’ve been scouring the web since Google really hasn’t had great documentation…especially in terms of their definition of “NDK Support”. Your blog has been the most useful. Thanks!

    Reply
  • Victor Mak says: January 7, 2016 at 4:56 am

    Hi, Ronnie. I am encountering the same situation, any clues yet? Thanks!

    Reply
  • Xavier Hallade says: January 19, 2016 at 6:28 pm

    Here is a snippet that may help you to add all your external source directories to your build:

    def extSourcesDirsPath = “…”
    cppFlags += “-I${file(extSourcesDirsPath)}”.toString()
    file(extSourcesDirsPath).eachDirRecurse { dir ->
    cppFlags += “-I${file(dir)}”.toString()
    }

    Reply
  • Steve Madsen says: December 3, 2015 at 3:11 pm

    Thank you Xavier — I noticed a couple of weeks ago the SDK added module “LLDB” in SDK Tools — hopefully this will eventually restore functionality lost when gdb support was removed from Android Studio 1.4.

    Reply
  • Rocky says: October 9, 2015 at 7:17 am

    Thanks Xavier!
    I followed the step to create a native method and press ALT+Enter
    but it always generate a .c file.
    How can I use ALT+Enter to generate a .cpp file?

    Reply
  • Hua says: December 15, 2015 at 6:04 am

    I encountered the same problem as you.

    Reply
  • Feisal says: October 16, 2015 at 5:30 am

    I have some c++ source code with dependencies to OpenCV, would I be able to link them using gradle build?

    Reply
  • Anthony says: October 28, 2015 at 7:14 pm

    Great post, thanks for keeping up with the updates and going into more than cursory detail. Where do you get the information on each new release? I can follow the releases on the repository, but I can’t seem to find any release notes anywhere.

    Reply
  • Pingback: Java Annotated Monthly – December 2015 | IntelliJ IDEA Blog
  • Krishna says: December 22, 2015 at 10:57 am

    Hello Xavier, Thanks for the detailed steps.. its a cake walk.
    In the tutorial you mentioned – “you can go to your Java sources, create a method prefixed with the native keyword, and press ALT+Enter to generate its C++ implementation:”
    when i did the same, its generating C implementation instead of C++; I have some C++ dependencies. How to get the C++ implementation instead of C implementation.

    Reply is appreciated.

    Reply
  • Xavier Hallade says: December 22, 2015 at 11:01 am

    You’re right, it’s generating a C implementation when you don’t have sources yet, not a C++ one.
    I don’t know a way to automatize this, but you can simply rename the file to cpp, and change the (jniEnv*)->XXX(env, …) calls to jniEnv->XXX(…) to make it C++.

    Reply
  • Olivier Roblin says: January 19, 2016 at 2:07 pm

    Hi Xavier,
    Thanks a lot for the post!
    I have an issue with the native debugger (it just doesn’t work, doesn’t stop at breakpoints, etc…). The issue occurs either if I build native code with gradle or with Android.mk/Application.mk like you describe.
    The problem may be due to my specific overall architecture : The app module depends to a library module in which I have my native .so libs. For debugging, I run the app with the native debugger but the native code to attach the debugger is inside the library module.
    In the Debug configuration, I add ‘moduleLib/src/main/obj/local/armeabi-v7a’ directory to the “Symbol directories”.
    This used to work with ADT.
    Do you have an idea of what is wrong ?
    Have you ever tried to debug native code inside a Java Library module ?

    Thanks,

    Reply
  • Xavier Hallade says: January 19, 2016 at 6:17 pm

    Hi,

    I’m using a library module in one of my projects too and I got debug working well.

    I had to add ./build/intermediates/binaries/*release*/obj/[abi] to the Symbol directories.

    Here is a gist extracted from my project: https://gist.github.com/ph0b/0575b30b67e04f2ec10f

    Reply
  • Olivier Roblin says: January 21, 2016 at 3:20 pm

    Yes it works!
    I added symbols from src/main/obj/local/[abi] in the case of Android.mk/Application.mk build. It doesn’t work.
    For the gradle build case, I don’t remember which symbol directory I added but certainly not the good one. With ‘./build/intermediates/binaries/*release*/obj/[abi]’, it’s ok.
    Thanks Xavier.

    Reply
  • Jimmy says: January 26, 2016 at 5:29 am

    I went through the tutorial over and over again, tried every permutation of the solutions in StackOverflow, and I’m still getting the message:

    Error:Gradle version 2.9 is required. Current version is 2.10.

    Do you have any idea of what could be wrong? I changed gradle-wraper.properties manually, tried to set it on the module settings, went to every single line over and over again, but still nothing.

    Reply
  • Xavier Hallade says: January 26, 2016 at 1:57 pm

    There are strong requirements regarding the various versions you’re using between gradle, gradle-experimental plugins and gradle itself.
    You can use gradle-experimental:0.6.0-alpha7 and/or gradle:2.0.0-alpha7 with gradle 2.10 – I’ve updated the article accordingly.
    Earlier alphas (I don’t remember which one exactly) needed gradle 2.9 – I’m trying to stick to the latest versions of everything, until anything becomes stable

    Reply
  • Jimmy says: January 27, 2016 at 12:42 am

    Hi Xavier, thanks for the help! Now I get the following error:

    Error:Exception thrown while executing model rule: BaseComponentModelPlugin.Rules createBinaryTasks
    java.lang.NullPointerException (no error message)

    Do you have any idea of what could be wrong? I have been using eclipse for Android Development for 4 years, and I can’t believe that I have such difficulty switching to AS. I have 3 days working on this :S

    Reply
  • Xavier Hallade says: January 27, 2016 at 11:40 am

    That’s the problem with the alpha status, the error messages are still mostly cryptic.. Maybe there is a syntax error somewhere, like in this issue: https://github.com/googlesamples/android-ndk/issues/146

    Reply
  • Olivier Roblin says: January 26, 2016 at 2:28 pm

    Hi Xavier,
    I have another question :
    * When I build my native code with former Android.mk/Application.mk, I don’t succeed in attaching the symbols and the debugger doesn’t work. (I add myLib/src/main/obj/local/[abi], which contains the symbolicated .so, to the Symbol directories).
    Do you know if it should work ? Have you ever tried this ?
    * The problem is actually critical, because I would have to include pure assembly files in my build. You already answered to someone (here : http://stackoverflow.com/questions/32092144/how-to-compile-android-ndk-with-gradle-that-contain-arm-assembly-optimizaions) that it’s probably not supported by gradle build. Still not more information about this ?

    Olivier

    Reply
  • Xavier Hallade says: January 26, 2016 at 2:42 pm

    You mean that you need to have breakpoints and symbols resolution working in your ndk code compiled with Android.mk/Application.mk, inside AS?
    I have tried it a bit and failed, like you did. Maybe there is a way to make it work, but I haven’t found it.

    For your use case, I’d generate static prebuilts using ndk-build, that are only including your assembly files and make them usable to other modules that will be compiled using gradle (see this gist for native dependencies: https://gist.github.com/ph0b/418132cb2f3f03a5534c). This way you will not have symbols and debugging from AS for all of your code, but at least you’ll have it for most of it.

    Reply
  • Olivier Roblin says: January 26, 2016 at 5:03 pm

    Yes that’s exactly what I currently do.
    But I wondered if you had a solution because you say “If the built-in gradle support isn’t suitable to your needs, you can get rid of it, while keeping the goodness of Android Studio C++ editing/debugging.”
    I thought you succeeded in debugging build from manual ndk-build.

    Thanks anyway,
    Olivier

    Reply
  • Xavier Hallade says: January 26, 2016 at 5:12 pm

    I actually did earlier, when it was possible to use the gdb backend. Now that only lldb is available I couldn’t make it work with Android.mk/Application.mk – I’ll update the article accordingly.

    Reply
  • Olivier Roblin says: January 29, 2016 at 4:09 pm

    Do you know if it’s possible to add ABI specific options in gradle ? For example, adding
    cppFlags.add(“-DUSE_NEON=1”) for armv7 build
    and cppFlags.add(“-DUSE_IPP”) for x86 build ?

    Of course, having different flavors would do the job, but I would prefer to have my x86 and armv7 libs in a single apk.

    Is it possible to test the ABI in gradle, somethink like :
    if (abi == “x86”) cppFlags.add(“-DUSE_IPP”) ?

    Beside, is it possible to add cppFlags for some files only ?

    Or the only way to do that is having different flavors and different apk ?

    Reply
  • Xavier Hallade says: January 29, 2016 at 4:45 pm

    I don’t see a way to do this yet outside of Android.mk or flavors.
    Although in your case, if it’s only to have various defines depending on the ABI, you could include a config header through cppFlags (-include xxx.h), and in that header, have your defines defined according to each ABI.

    Reply
  • 總結(jié)

    以上是生活随笔為你收集整理的The new NDK support in Android Studio 1.3的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    国产理论片在线观看 | 国产三级av在线 | 精品国模一区二区三区 | 六月激情丁香 | 91丨精品丨蝌蚪丨白丝jk | 97超碰在线免费 | 久久久久久久久久久久电影 | 黄色小说视频网站 | 日韩资源在线观看 | 久久久精品二区 | 国产福利资源 | 国产亚洲精品久 | 日韩高清片 | 久草在线资源视频 | 亚洲精品国偷拍自产在线观看蜜桃 | 91九色视频网站 | 国产精品中文久久久久久久 | 日韩av一区二区在线 | av888.com| 97超碰资源网 | 国产91在线看 | 欧美亚洲免费在线一区 | 日本成人中文字幕在线观看 | 午夜国产一区 | 天天想夜夜操 | 亚洲精品在线一区二区 | 高清不卡毛片 | 日本中文字幕高清 | av片子在线观看 | 亚洲欧美精品一区二区 | 欧美先锋影音 | 亚洲国产中文字幕在线观看 | 超碰在线个人 | 久久色在线观看 | 97超碰免费在线观看 | 99视频免费看 | 一本一本久久a久久精品综合妖精 | 手机av电影在线 | 日韩在线一区二区免费 | 九九热在线视频免费观看 | 一区二区三区高清在线 | 天堂黄色片 | av网址最新| 中文字幕在线观看国产 | 黄色1级大片 | 色婷婷丁香 | 久草网免费 | 久久精品亚洲 | 亚洲成人午夜av | 国产综合精品久久 | 91自拍91| 色综合久久天天 | 久久久国产精品成人免费 | 一级黄色电影网站 | 久久久久久看片 | 国产精品福利av | 国产午夜在线观看视频 | 国产一区二区免费看 | 精品国内 | 国产特级毛片 | 日韩剧| 97在线资源 | 亚洲第二色| 亚洲视频免费 | 天天做天天爱夜夜爽 | 欧美激情另类文学 | 午夜精品一区二区三区在线播放 | 在线观看免费日韩 | 亚洲在线视频网站 | 欧美另类xxx | 久草视频视频在线播放 | 中文字幕精品三级久久久 | 深爱激情站 | 久久国产一区二区三区 | 日韩电影在线观看一区二区三区 | 国产精品第十页 | 欧美日韩在线视频一区 | 亚洲国产日韩欧美 | 96av在线| 久久免费视频播放 | 国精产品永久999 | 亚洲第二色 | 国产欧美在线一区 | av中文字幕第一页 | 在线观看一级 | 国产精品嫩草影视久久久 | 久久精品国产成人精品 | 久久久久国产成人精品亚洲午夜 | 五月婷婷爱| 婷婷看片 | 免费观看一区二区 | 亚洲影视资源 | 日韩欧美网站 | a级国产乱理论片在线观看 特级毛片在线观看 | 青青草国产精品视频 | 在线激情网 | 激情五月婷婷 | 在线免费观看国产精品 | 99精品欧美一区二区 | 97视频免费播放 | 狠狠色丁香婷婷综合基地 | 在线精品在线 | 国产精品区二区三区日本 | 亚洲欧洲视频 | 久久国产精品小视频 | 精品九九久久 | 亚洲激情在线观看 | 亚洲影院一区 | 欧美激情视频一区二区三区免费 | 国产91精品一区二区 | 久久精品欧美 | 在线电影日韩 | 成人在线视频免费看 | 天天操天天摸天天干 | 婷婷免费视频 | 欧美成人视 | 最近中文字幕完整高清 | 久久成人高清 | 亚洲 中文 在线 精品 | 91国内在线| 日韩久久精品一区 | 亚洲最大在线视频 | 国产精品久久久久久久久久久久午夜片 | 五月天久久久久久 | www.香蕉视频在线观看 | 国产精品免费小视频 | 午夜视频在线观看一区二区 | 国产精品理论在线观看 | 日韩av午夜在线观看 | 97在线视频免费观看 | 久草免费看 | 91成人午夜 | 国产精品一区二区三区四 | 午夜黄色大片 | 中文字幕视频 | 久久综合五月天婷婷伊人 | 在线国产高清 | 最近中文字幕视频完整版 | 91在线看视频 | 国产粉嫩在线 | 91精品国产综合久久婷婷香蕉 | 国产精品毛片久久久久久久久久99999999 | 欧美男同网站 | 国产无套一区二区三区久久 | 日韩欧美在线中文字幕 | 江苏妇搡bbbb搡bbbb | av一区二区三区在线 | 国产在线欧美在线 | 欧美精品乱码久久久久 | 欧美日韩国产一区二区三区在线观看 | 视频一区二区精品 | 三级av在线 | 亚洲成人黄色 | 天堂av在线免费 | www.国产毛片| 成人免费中文字幕 | 伊人色播 | 中文字幕在线色 | 黄色软件在线观看视频 | 日本色小说视频 | 欧美另类重口 | 99热在线看 | 国产精品久久久久久麻豆一区 | 国产一区免费 | 五月天丁香视频 | 国产高清视频网 | 人人草在线视频 | 欧美国产亚洲精品久久久8v | 亚洲精品动漫成人3d无尽在线 | 久久9999久久免费精品国产 | 国产精品五月天 | 亚洲做受高潮欧美裸体 | 一级黄色在线免费观看 | 黄色免费在线视频 | 日韩午夜在线观看 | 日韩色av色资源 | 91在线国产观看 | 色综合久久久久网 | 久久久高清视频 | 99电影| 91麻豆精品久久久久久 | 天堂av高清| www黄色av| 天天操天天操一操 | 国产破处在线播放 | 久久免费看a级毛毛片 | 久久九九久久 | 欧美激情第28页 | 国产成人一区二区三区久久精品 | 午夜精品久久久久久99热明星 | 成人av电影免费 | 天天做综合网 | 偷拍视频一区 | 波多野结衣在线观看视频 | 国内精品免费久久影院 | 亚洲精品国产成人 | 久久久99国产精品免费 | 久久精品国产v日韩v亚洲 | 日日干夜夜操视频 | 国内外成人在线 | 人人爱爱人人 | 久久国产高清视频 | 日本精品一区二区三区在线播放视频 | 亚洲高清久久久 | 欧美午夜a| 美女久久视频 | 日韩专区在线观看 | 国色综合| 久草在线免费资源站 | 九九九毛片| 黄视频网站大全 | 亚洲成人影音 | 婷婷综合在线 | 91久久精品日日躁夜夜躁国产 | 超碰大片 | 久久人人爽爽人人爽人人片av | 麻豆传媒视频在线 | 五月开心综合 | 在线免费观看黄 | 成人性生活大片 | 在线国产视频 | 一区二区久久久久 | 亚洲精品国产精品乱码不99热 | 成年人毛片在线观看 | 伊人午夜视频 | 毛片1000部免费看 | 97视频免费 | 亚洲成人资源在线观看 | 免费黄色av. | 亚洲性少妇性猛交wwww乱大交 | 91免费看黄| 免费高清在线视频一区· | 国产综合激情 | 99久高清在线观看视频99精品热在线观看视频 | 免费日韩视 | 夜夜狠狠 | 天天天天射 | av看片在线| 99999精品 | 中文字幕超清在线免费 | 免费黄色网址网站 | 中文字幕av播放 | 国产精品24小时在线观看 | 免费一级片观看 | 国产区精品在线观看 | 久久久综合香蕉尹人综合网 | 免费男女羞羞的视频网站中文字幕 | 激情五月在线 | 成人羞羞视频在线观看免费 | 国产 中文 日韩 欧美 | 天天操夜夜干 | 久久精品99国产国产精 | 麻豆传媒在线免费看 | 久久久久久久久久久免费av | 91亚洲精品在线观看 | 亚洲日本在线视频观看 | 夜夜爽天天爽 | 中国成人一区 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 亚洲毛片一区二区三区 | 九九在线免费视频 | 日韩成人一级大片 | 99视频播放| 亚洲va韩国va欧美va精四季 | 521色香蕉网站在线观看 | 丁香亚洲 | 九九免费在线观看 | 久草视频在线资源站 | 久久久久久久久久免费 | 日本久久99 | 黄色aaa级片| 久久精品www人人爽人人 | 就要干b| 午夜视频免费播放 | 国产精品久久久久久久久久久久午夜 | 国产一区二区在线免费播放 | 2020天天干天天操 | 精品一区二区电影 | 99精品免费久久久久久日本 | 亚洲免费专区 | 久久国产片 | 欧美午夜精品久久久久久浪潮 | 国产日韩欧美视频 | 丁香视频全集免费观看 | 欧美99精品 | 深爱婷婷网 | 色婷婷狠狠五月综合天色拍 | 日韩在观看线 | 亚洲一区二区三区毛片 | 毛片99| 免费国产亚洲视频 | 九九九在线 | 欧美日韩国产精品爽爽 | 久久手机看片 | 天天综合区 | 亚洲黄a | 精品黄色在线观看 | 成年人国产视频 | 国产精品久久久久久欧美 | 欧美久久久久久久久久久 | 天天做天天爱夜夜爽 | 美女黄频免费 | 人成在线免费视频 | 亚洲视频电影在线 | wwwwww黄| 91最新视频在线观看 | 99精品国产aⅴ | 色婷婷成人网 | 激情欧美xxxx | 在线观看一级视频 | 狠狠色网 | 97国产 | 激情在线免费视频 | 亚洲男女精品 | 日韩黄色免费在线观看 | 精品久久国产 | 免费97视频 | 天天综合操 | 亚洲精品美女久久17c | 色婷婷婷 | 日韩精品视频免费在线观看 | 国产一级免费电影 | 日韩乱理 | 欧美成人69av | 97看片| 欧美另类z0zx | 日韩av高潮 | 成年人在线看视频 | 国产亚洲精品久久久网站好莱 | www日韩欧美| 夜夜躁狠狠躁 | 欧美一级片免费播放 | 99日精品| 五月天开心 | 久久免费成人网 | 国产综合久久 | 99热精品在线| 精品免费久久 | 日日夜夜中文字幕 | 亚洲免费观看在线视频 | 手机av在线网站 | 欧美国产精品久久久久久免费 | 亚洲永久精品在线观看 | 激情小说网站亚洲综合网 | 99精品在线免费在线观看 | 91在线免费公开视频 | 99色在线视频 | 久久五月婷婷丁香 | 国产精品大全 | 狠狠插狠狠操 | 国产99在线播放 | 综合色久 | 久草在线免费资源 | 成人久久18免费网站 | 免费福利片 | 欧美精彩视频在线观看 | 日日夜夜精品视频天天综合网 | 亚洲第一久久久 | 九九精品久久久 | 中文字幕韩在线第一页 | 精品免费国产一区二区三区四区 | www婷婷| 日日夜夜天天人人 | 久久国产精品免费视频 | 高清av在线 | 2020天天干夜夜爽 | 国产精品久久久久久久久久不蜜月 | 成人三级网站在线观看 | 午夜精品久久久99热福利 | 激情五月激情综合网 | 波多野结衣一区三区 | 国产一区视频导航 | 日韩精品一区二区三区视频播放 | 四虎影院在线观看av | 免费黄色特级片 | 波多野结衣精品在线 | 在线视频日韩 | 日韩免费一级电影 | av大全免费在线观看 | 97人人人人 | 521色香蕉网站在线观看 | 色吊丝在线永久观看最新版本 | 国产电影一区二区三区四区 | av爱干| 国产成人99av超碰超爽 | 日韩综合精品 | 国产精品久久电影网 | 国产91精品欧美 | 日日夜夜亚洲 | 伊人久久av | 天天爽人人爽夜夜爽 | 三上悠亚一区二区在线观看 | 中文字幕在线看视频国产 | 米奇狠狠狠888 | 国产这里只有精品 | 丁香六月婷婷 | 免费a视频在线 | 色 中文字幕 | 国产免费国产 | 黄色官网在线观看 | 日韩三级av| 又黄又爽又湿又无遮挡的在线视频 | 国产一区二区不卡视频 | 亚洲国产美女久久久久 | 人人盈棋牌 | h网站免费在线观看 | av电影免费在线播放 | 国产成人精品久久久久蜜臀 | 午夜黄色影院 | 热久久视久久精品18亚洲精品 | 啪啪免费视频网站 | 国产美腿白丝袜足在线av | av一级片在线观看 | 日韩av伦理片 | 色在线亚洲 | av成人免费观看 | 国产v亚洲v | 久久综合电影 | 天天操天天综合网 | 久久精品中文字幕一区二区三区 | 国产在线色 | 二区三区毛片 | 免费网站看v片在线a | 亚洲国产成人av网 | 色网免费观看 | 日本高清中文字幕有码在线 | 日韩城人在线 | 久久视频免费 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 国产99自拍 | 久久久99精品免费观看乱色 | 亚洲片在线| 99超碰在线观看 | av免费看网站 | 91福利区一区二区三区 | 黄色成年片 | 免费a v观看| 日韩精品一区二区三区水蜜桃 | 日韩av免费在线看 | 国产精品99久久久久久有的能看 | 亚洲人成影院在线 | 最新av免费 | 香蕉网在线播放 | 91亚洲欧美 | 国产一级做a | 欧美日韩p片 | 成人毛片一区 | 欧美中文字幕久久 | 久久久免费看视频 | 九九久久久久久久久激情 | 狠狠操狠狠干2017 | 天堂av在线中文在线 | 久草在线久 | 97国产 | 一区中文字幕在线观看 | 美女网站在线观看 | 超碰公开在线 | 色噜噜狠狠狠狠色综合久不 | 日韩精品一区二区三区电影 | 亚洲电影一区二区 | 中文字幕亚洲精品日韩 | 18久久久| 天天干天天上 | 日韩激情av在线 | 在线看av的网址 | 亚洲欧洲中文日韩久久av乱码 | 97成人免费视频 | 探花视频免费观看高清视频 | 在线观看av片| 精品国内自产拍在线观看视频 | 国产伦理一区 | 国产精品国产三级国产aⅴ无密码 | 综合网久久 | 日韩三级视频在线观看 | 久久精品国产精品 | 日韩激情视频在线 | 成人在线观看免费视频 | 久久成人免费视频 | 欧美xxxx性xxxxx高清 | 免费网站观看www在线观看 | 中文字幕资源网在线观看 | 天天久久综合 | 亚洲精品国产精品久久99热 | 黄色三级在线观看 | 亚洲,播放 | 久久人人精 | 久久夜夜夜 | 99爱国产精品 | 一区二区精品在线 | 久久在线电影 | 91热爆视频 | 欧美日韩一区二区在线 | 国产一区二区久久久 | 欧美视屏一区二区 | 天天伊人狠狠 | 婷婷色六月天 | 欧美日韩3p| 国产中文字幕在线看 | 91资源在线 | 在线观看中文字幕亚洲 | 久久首页| 亚洲精欧美一区二区精品 | 日韩在线免费小视频 | 人人看97| 久久人人97超碰精品888 | 亚洲国产电影在线观看 | 制服丝袜在线 | 黄色亚洲精品 | 日韩欧美不卡 | 三级黄色a | 亚洲国产播放 | 亚洲h在线播放在线观看h | 国产精品久久伊人 | 91av手机在线观看 | 九九热精品视频在线观看 | 99一区二区三区 | 免费观看v片在线观看 | 天天拍天天爽 | 久久综合给合久久狠狠色 | 99热在线观看 | 中文字幕婷婷 | 久久久久久久久久久免费av | 久艹在线播放 | 天天综合网在线观看 | 伊人激情网 | 最新中文字幕在线观看视频 | 五月天电影免费在线观看一区 | 中文日韩在线 | 2021久久| 婷婷九月丁香 | 久久高清免费视频 | 黄色精品视频 | 999成人 | 亚洲精品国产精品久久99热 | www日韩高清| 九色精品免费永久在线 | 亚洲人在线视频 | 国内精品久久久久 | 91视频大全 | 中文字幕激情 | 五月激情婷婷丁香 | 国产精品欧美日韩在线观看 | 99在线观看 | 色黄视频免费观看 | 欧美日韩免费观看一区二区三区 | 久久婷婷亚洲 | 国产精品成人品 | 国产高清视频免费在线观看 | 玖玖视频 | 国产精品久久久久久久久久直播 | 国产精品门事件 | 97理论片| 在线视频成人 | 黄a在线看 | 久久私人影院 | 久久免费久久 | 色欲综合视频天天天 | 国产精品久久久久永久免费看 | 久久中文网 | 日韩大片在线免费观看 | 最近日本韩国中文字幕 | 久久激情五月婷婷 | 国产精品久久久久久一区二区 | 国产精品美女免费 | 超碰国产在线 | 久久综合久久综合这里只有精品 | 中文字幕国产亚洲 | 久久九九免费 | 激情黄色一级片 | 日韩有色| 日韩理论在线视频 | 国产精品18久久久久久久久久久久 | 97成人精品 | 伊人婷婷网 | 91污污| 一级全黄毛片 | 99在线精品视频观看 | 日韩一区二区三区高清在线观看 | 人人爽人人澡 | 亚洲第二色 | 日韩高清免费在线 | 人人澡人人模 | 国产不卡免费av | 亚洲国产理论片 | 九九精品毛片 | 天天干干 | 欧美精品九九99久久 | 久久久免费播放 | 久草电影免费在线观看 | 久草综合在线观看 | 亚洲伊人第一页 | 一区二区在线影院 | 国产精品久久久久久久久久久久冷 | 中文字幕亚洲欧美日韩2019 | 成人91视频| 午夜视频欧美 | 91av手机在线| 国产精品久久久久三级 | 国产人成看黄久久久久久久久 | 午夜精品电影 | 亚洲欧美视频网站 | 国产91免费观看 | 中文字幕免费不卡视频 | 天天躁日日躁狠狠躁av中文 | 98精品国产自产在线观看 | 最近中文字幕视频网 | 久久尤物电影视频在线观看 | 色婷婷国产在线 | 亚洲国产剧情av | 一本一本久久a久久 | 色5月婷婷| 日韩高清精品一区二区 | 国产精品久久久久久久久软件 | 97在线影视| 国产一区二区三区免费在线 | 欧美精品午夜 | 97视频在线观看网址 | 国产精品毛片一区二区在线看 | 久久情侣偷拍 | 亚洲在线免费视频 | 久久久久国产精品午夜一区 | 五月激情五月激情 | 色狠狠婷婷 | 欧美日韩国产欧美 | 夜夜夜精品 | 99精品视频免费全部在线 | 亚洲黄网址 | 99精品免费| 一区二区三区在线免费观看 | 99热这里是精品 | 国产精美视频 | 五月在线| 国产精品原创 | 日韩精品在线看 | 国产成人av电影在线观看 | 中文字幕丝袜 | 中文在线a天堂 | 天天干天天搞天天射 | 蜜桃视频日韩 | 在线免费色| 欧美精品小视频 | 91精品第一页 | 人人超在线公开视频 | 欧美亚洲国产一卡 | 国产成人精品午夜在线播放 | 亚洲精品高清视频 | 九九九热精品免费视频观看网站 | 麻豆视频免费入口 | 精品视频一区在线 | 97av在线视频 | 96精品高清视频在线观看软件特色 | 午夜国产影院 | 色婷婷五 | 777视频在线观看 | 在线观看精品视频 | 成人午夜剧场在线观看 | 黄色av免费在线 | 欧美日韩在线免费视频 | 久久久久亚洲精品国产 | 麻豆国产精品视频 | 国产视频每日更新 | 国产成人精品一区二区三区福利 | 天天弄天天干 | 日韩av在线小说 | 天天干天天想 | 在线免费观看麻豆 | 综合色中文 | 欧美a免费| 国产成人高清在线 | 午夜三级大片 | 色美女在线 | 成人黄色av网站 | av 一区 二区 久久 | 在线观看免费观看在线91 | 国产精品美女久久久 | 毛片网在线观看 | 一区二区三区四区在线 | 天天干夜夜爽 | 中文av一区二区 | 精选久久| 91麻豆精品国产自产在线 | 成人影视免费看 | 日韩免费电影网站 | 极品嫩模被强到高潮呻吟91 | 亚洲a色| 福利区在线观看 | 国产一区二区成人 | 欧美日韩一区久久 | 久草在线视频中文 | 亚洲无毛专区 | 国产精品女人久久久久久 | 天天天插| 免费观看91视频大全 | 视频在线观看入口黄最新永久免费国产 | 欧美日本在线视频 | 久久视频99| 国产精品乱码在线 | 天天色影院 | 精品亚洲视频在线观看 | 人人爱人人舔 | 久久伦理视频 | 狠日日| 久久久www成人免费毛片麻豆 | 日日摸日日添夜夜爽97 | 国产第一二区 | 特级毛片网| 久久久五月天 | 美女黄视频免费 | 国产精品9999久久久久仙踪林 | 国产综合精品久久 | 欧美日韩国产一二 | 欧美日韩二区在线 | 色婷婷综合视频在线观看 | 波多野结衣在线中文字幕 | 丁香婷婷激情啪啪 | 在线观看精品国产 | 午夜精品一区二区三区四区 | 91亚洲狠狠婷婷综合久久久 | 国产黄色大全 | www.97视频| 久草免费在线观看 | 少妇高潮流白浆在线观看 | 欧美午夜性 | 丁香一区二区 | 香蕉网站在线观看 | 麻豆视频免费看 | 欧美天堂久久 | 18女毛片 | 69亚洲精品 | 五月天视频网站 | 久久99精品国产麻豆宅宅 | 亚洲精品字幕在线观看 | 天天操网址 | 久久国产精品一二三区 | 国产精品美女久久久久aⅴ 干干夜夜 | 免费观看一级视频 | 亚洲综合色视频在线观看 | 国产成人精品午夜在线播放 | 久久激情电影 | www久草 | 一级黄色电影网站 | 天天操天天摸天天爽 | 中文字幕在线看视频国产中文版 | 色中色综合 | 日韩成人精品一区二区 | 超碰在线99 | 婷婷在线网站 | 欧美精品在线观看一区 | 日本精品视频在线观看 | 中文字幕a∨在线乱码免费看 | 免费高清在线观看成人 | 91麻豆免费视频 | 欧美一区二区三区免费观看 | 九九免费在线看完整版 | 亚洲jizzjizz日本少妇 | 99热这里只有精品国产首页 | 91免费国产在线观看 | 国产精品久久久久久久av电影 | 99在线精品视频在线观看 | 久久狠狠一本精品综合网 | 亚洲精品欧美视频 | 成人羞羞免费 | 91视频久久 | 人人插人人搞 | 激情婷婷 | 欧美在线观看视频 | 97成人在线视频 | 国产又粗又猛又爽 | 国产视频每日更新 | 国产福利免费在线观看 | 亚洲午夜久久久综合37日本 | 狠狠插狠狠操 | 日韩网站视频 | 国产xxxx做受性欧美88 | 成人天堂网 | 中文字幕一区二区三区乱码不卡 | a级免费观看 | 国产九色视频在线观看 | 亚州天堂 | 99精品国自产在线 | 黄色三级免费看 | 国产精品一区二区三区99 | 亚洲精品中文字幕视频 | 四虎在线免费观看视频 | 丁香激情综合 | 视频成人免费 | 国产精品成人一区二区 | 国产一区免费看 | 亚洲精品国产免费 | 欧美9999| 国产精品永久免费在线 | 九九爱免费视频在线观看 | 麻豆视频在线免费观看 | 91精品伦理 | 成人免费亚洲 | 免费观看黄 | 国产精品成久久久久三级 | 中文字幕一区三区 | 97电影在线看视频 | 久久伊人免费视频 | 国产视频 亚洲精品 | 国产最新福利 | 亚洲女同videos | 国产又粗又猛又爽又黄的视频先 | 91av片 | 99精品热视频 | 久久综合欧美精品亚洲一区 | 亚洲激情在线视频 | 天天干天天天 | 久久久久久久久久久久久影院 | 国产在线不卡一区 | 精品久久久久久亚洲综合网站 | 免费欧美精品 | 在线色亚洲 | 日韩午夜在线观看 | 中文字幕999| 在线精品亚洲 | 欧美日韩久久一区 | 99精品欧美一区二区 | 91中文视频 | 国产丝袜网站 | 在线观看中文字幕第一页 | 亚洲国产日韩欧美 | 韩国精品一区二区三区六区色诱 | 日韩网站中文字幕 | 成人影片在线播放 | 五月天综合激情网 | 成片免费观看视频大全 | 欧美日韩一区二区免费在线观看 | 欧美日韩一二三四区 | 国产精品一区在线观看你懂的 | 欧美成人播放 | 久久99精品久久久久婷婷 | 91久草视频 | 91久久精品一区二区二区 | 一级黄色大片 | 日韩中文字幕免费看 | adc在线观看 | 亚洲一区二区三区在线看 | 超碰97人人射妻 | 99 精品 在线| 国产精品麻豆视频 | 久久成人免费视频 | 91看片在线免费观看 | 美腿丝袜一区二区三区 | 97视频人人免费看 | 精品在线观看国产 | av中文字幕在线播放 | 日韩欧美视频免费在线观看 | 国产一线天在线观看 | 国产麻豆果冻传媒在线观看 | 丁香婷婷射 | 少妇bbbb| a成人v在线| 久久精品3 | 99re国产| 999精品视频 | 91亚洲精品国偷拍自产在线观看 | 操操操人人 | www.操.com| 亚洲精品免费观看视频 | 国产精品精品久久久久久 | 欧美少妇xxxxxx | 黄色大片日本免费大片 | 天天爱av导航 | 六月色播| 五月婷婷丁香在线观看 | 亚洲国产精彩中文乱码av | 五月婷婷综合久久 | 成 人 黄 色视频免费播放 | 国产精品精品国产婷婷这里av | 成人免费大片黄在线播放 | 久久精品日本啪啪涩涩 | 四虎永久免费在线观看 | 国产亚洲精品久久久久久网站 | 国产精品乱码一区二三区 | 久久a v视频 | 96久久久 | 国产精品视频专区 | 欧美少妇影院 | 午夜婷婷在线观看 | 中文字幕有码在线播放 | 精品国产欧美一区二区三区不卡 | 91中文字幕一区 | 国产精品久久99 | 日韩高清免费在线观看 | 九色福利视频 | 久草免费福利在线观看 | 久久福利小视频 | 久久婷婷激情 | 波多野结衣一区二区三区中文字幕 | 中文网丁香综合网 | 日本不卡一区二区 | 在线涩涩 | 久久综合色天天久久综合图片 | 99热这里只有精品免费 | 在线天堂8√ | 久久久国产精品一区二区中文 | v片在线播放 | 六月丁香在线视频 | 99久久精品国产一区 | 久久人人添人人爽添人人88v | 超级碰碰碰免费视频 | 久久久国产一区二区 | 久久久久久蜜av免费网站 | 91看片成人| 亚洲国产美女精品久久久久∴ | 亚洲日本精品 | 波多野结衣小视频 | 久久人人爽人人 | 91在线你懂的 | 欧美激情va永久在线播放 | 久久精品视频播放 | 久久综合婷婷国产二区高清 | 精品黄色在线观看 | 亚洲精品国产精品乱码不99热 | 亚洲精品456在线播放第一页 | 日韩在线观看高清 | 亚洲一级二级 | 91在线播| 亚洲五月激情 | 91中文字幕网 | 久久久久久久久网站 | 久久久激情网 | 91精品国产综合久久福利不卡 | 久久99久久99精品免观看粉嫩 | 爱爱av网| 在线欧美日韩 | 波多野结衣一区三区 | 乱男乱女www7788 | 日韩电影在线观看一区二区三区 | www.69xx| 亚洲国产精品视频在线观看 | 中文字幕一区在线 | 韩国av免费在线 | 日韩电影在线视频 | 国产精品久久久999 国产91九色视频 | av大全在线播放 | 射射色| av不卡网站 | 国产在线美女 | 国产小视频免费在线观看 | 一区二区三区精品久久久 | 在线天堂中文在线资源网 | 狠狠狠狠狠狠狠狠干 | 最新国产精品久久精品 | 欧美一级专区免费大片 | 日日久视频| 国产人免费人成免费视频 | 国产精品18久久久久久不卡孕妇 | 亚洲成人av一区 | 日韩免费视频线观看 | 91精品国产91| 在线观看黄色大片 | 国产91aaa | 中文字幕丝袜美腿 | 精品 激情| 这里只有精彩视频 | www色网站| 国产免费高清视频 | 久久96国产精品久久99软件 | 国产一区黄色 | 亚洲成人精品久久久 | 亚洲五月六月 | 国内久久精品视频 | 国产一区二区中文字幕 | 精品欧美一区二区精品久久 | 亚洲国产美女久久久久 | 国产精品久久久久久久久久久久冷 | 最近中文字幕久久 | 免费福利片2019潦草影视午夜 | 丁香五月网久久综合 | 美女视频久久久 | 免费看片网址 | 996久久国产精品线观看 | 国产精品女人久久久久久 | 成年人免费观看国产 | 天天射天天干天天 | 天天色天天干天天色 | 美女视频黄免费的 | 国产一区二区不卡视频 | 黄色av电影在线观看 | 久草电影免费在线观看 | 久久刺激视频 | 91黄色在线看 | 99热九九这里只有精品10 | 亚洲日本欧美在线 | 夜添久久精品亚洲国产精品 | 久久免费福利 | 国产黄色片久久 | 天天干天天干天天射 | 亚洲精品免费观看视频 | a在线观看视频 | 亚洲国产精品久久 | 亚洲日韩中文字幕在线播放 | 亚洲精品免费在线观看 | 亚洲精品在线播放视频 | 久久国产精品偷 |