【问题标题】:integrate POCO library in android ndk在 android ndk 中集成 POCO 库
【发布时间】:2016-05-30 08:12:48
【问题描述】:

我正在尝试开发使用POCO socket 库和android NDK 的跨平台应用程序(在本机级别)。但我不知道如何在工作室中使用 gradle 在android NDK 中集成/使用POCO library

我正在使用com.android.tools.build:gradle-experimental:0.7.0 gradle 版本。 以下是我的build.gradle

apply plugin: 'com.android.model.application'
model {
    android {
        compileSdkVersion 23
        buildToolsVersion "23.0.2"

        defaultConfig {
            applicationId "com.ndkproto"
            minSdkVersion.apiLevel = 22
            targetSdkVersion.apiLevel = 23
            versionCode = 1
            versionName = "1.0"
        }
        buildTypes {
            release {
                minifyEnabled = false
                proguardFiles.add(file('proguard-android.txt'))
            }
        }

        ndk {
            moduleName = "ndk-proto-jni"
            stl "stlport_static"
            ldLibs.addAll(['android', 'log'])
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.2.1'
    compile 'com.android.support:design:23.2.1'
}

我已经下载了POCO library,但不知道要在build.gradle 文件中更改什么以在ndk 中使用其C++ 函数。我试图在网上搜寻,但找不到与此相关的任何材料或官方指南。

【问题讨论】:

    标签: android c++ android-studio android-ndk poco-libraries


    【解决方案1】:

    好吧,我没有尝试过使用 POCO 库,但我成功地使用了 non-boost asio 库。 看,我做了什么。

    将asio文件按如下方式放入目录

    java
    jni
    prebuilt
        asio
            1.10.6
                asio_files_and_directories
        openssl
            armeabi
                include
                lib
            x86
                include
                lib
    

    然后我用gradle-experimental plugin写了build.gradle

    buildscript {
        repositories {
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle-experimental:0.7.0'
        }
    }
    
    apply plugin: 'com.android.model.library'
    
    import org.gradle.internal.os.OperatingSystem;
    
    final APP_ABIS = ["x86", "armeabi"]
    
    model {
        repositories {
            libs(PrebuiltLibraries) {
                openssl {
                    binaries.withType(SharedLibraryBinary) {
                        if (targetPlatform.getName() == "armeabi" || targetPlatform.getName() == "x86") {
                            headers.srcDir file("src/main/prebuilt/openssl/${targetPlatform.getName()}/include")
                            sharedLibraryFile = file("src/main/prebuilt/openssl/${targetPlatform.getName()}/lib/libssl_1_0_0.so")
                        }
                    }
                }
                opencrypto {
                    binaries.withType(SharedLibraryBinary) {
                        if (targetPlatform.getName() == "armeabi" || targetPlatform.getName() == "x86") {
                            headers.srcDir file("src/main/prebuilt/opencrypto/${targetPlatform.getName()}/include")
                            sharedLibraryFile = file("src/main/prebuilt/openssl/${targetPlatform.getName()}/lib/libcrypto_1_0_0.so")
                        }
                    }
                }
            }
        }
    
        android {
            compileSdkVersion = 23
            buildToolsVersion = "23.0.2"
    
            defaultConfig.with {
                minSdkVersion.apiLevel 16
                targetSdkVersion.apiLevel 23
                versionCode 1
                versionName "1.0"
            }
        }
    
        android.sources.main {
            jni {
                source {
                    srcDir file("src/main/jni")
                }
    
                exportedHeaders {
                    srcDir file("src/main/prebuilt/asio/1.10.6/include")
                }
    
                dependencies {
                    library "openssl" linkage "shared"
                    library "opencrypto" linkage "shared"
                }
            }
    
            jniLibs {
                dependencies {
                    library "openssl"
                    library "opencrypto"
               }
            }
        }
    
        android.ndk {
            moduleName "ndk_module_with_asio"
    
            cppFlags.add("-std=c++11")
            cppFlags.add("-fexceptions")
            cppFlags.add("-frtti")
            cppFlags.add("-D__STDC_CONSTANT_MACROS")
            cppFlags.add("-DASIO_STANDALONE")
    
            abiFilters.addAll(APP_ABIS)
    
            ldLibs.addAll(["android", "log", "m", "z"])
    
            stl "gnustl_static"
        }
    
        android.buildTypes {
            debug {
                minifyEnabled = false
                proguardFiles.add(file('proguard-project.txt'))
                ndk.with {
                    debuggable = true
                }
            }
            release {
                minifyEnabled = false
                proguardFiles.add(file('proguard-project.txt'))
            }
        }
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:multidex:1.0.1'
        compile 'com.google.guava:guava:19.0'
    }
    

    我还有带有 jni 函数的 java 文件来调用我的本机方法,并且在应用程序启动时我会这样做

    try {
        System.loadLibrary("ssl_1_0_0");
        System.loadLibrary("crypto_1_0_0");
        System.loadLibrary("ndk_module_with_asio");
    }
    catch( UnsatisfiedLinkError ex ) {
        System.out.println("Native.java System.loadLibrary error occured: " + ex);
    }
    

    如您所见,我已加载手动构建的 openssl 版本。但这不是必需的。我添加了它,因为 android openssl 库很旧,并展示了如何使用 gradle 加载共享库。 我希望,有了这个例子,你可以加载 POCO 库,或者只使用非 boost asio。

    【讨论】:

    • 对于 asio,您只是将内容从 C:\Users\niharb\Downloads\asio-1.10.6\asio-1.10.6\include 复制到 jni\prebuilt\asio 吗?
    • 是的。 asio_files_and_directories - docincludesrc 目录和所有其他文件。
    • 我已经尝试过你的方法,但我遇到了一些错误http://s33.postimg.org/7w6a85nzj/image.pnghttp://s33.postimg.org/h2y9tu1f3/image.png
    • 请检查exportedHeaders 部分。路径是否相同,您的标题在哪里? 检查两次你使用gradle-experimental plugin吗?您是否尝试过删除所有临时 gradle 目录以获得干净的构建?
    • 查看我的编辑,是的,我正在使用gradle-experimental
    猜你喜欢
    • 2015-11-02
    • 1970-01-01
    • 2011-06-25
    • 2014-03-31
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多