【问题标题】:Using prebuilt native .so library from java in Android Studio using experimental gradle plugin使用实验性 gradle 插件在 Android Studio 中使用来自 java 的预构建本机 .so 库
【发布时间】:2016-03-23 13:35:27
【问题描述】:

我在 Android Studio 中的一个新项目中添加了 2 个 .so 预构建库,该项目使用的是实验性 gradle 插件 (com.android.tools.build:gradle-experimental:0.6.0-beta5)。

我的 build.gradle 文件如下所示:

apply plugin: 'com.android.model.application'

model {
    repositories {
        prebuilt(PrebuiltLibraries) {
            gstplayer {
                binaries.withType(SharedLibraryBinary) {
                    sharedLibraryFile = file("libs/libgstplayer.so")
                    sharedLibraryFile = file("libs/libgstreamer_android.so")
                }
            }
        }
    }
    android {
        compileSdkVersion 23
        buildToolsVersion "23.0.2"

        defaultConfig {
            applicationId "com.myexample.gstreamertest2"
            minSdkVersion.apiLevel 19
            targetSdkVersion.apiLevel 23
            versionCode 1
            versionName "1.0"

            buildConfigFields {
                create() {
                    type "int"
                    name "VALUE"
                    value "1"
                }
            }
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles.add(file('proguard-rules.pro'))
            }
        }

        ndk {
            moduleName "gstplayer"
        }

        productFlavors {
            create("flavor1") {
                applicationId "com.app"
            }
        }

        // Configures source set directory.
        sources {
            main {
//                jni {
//                    source {
//                        srcDirs = ['src/main/jni']
//                    }
//                }
                jniLibs {
                    dependencies {
                        library "gstplayer"
                    }
                }
            }
        }
    }
}

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

Gradle 构建成功,但我在任何地方都找不到有关如何引用这些库的说明。我知道你可以在你的 Java 文件中创建 public native String getInfoFromJni() 并在你的 jni 文件夹中引用本机 .c 文件,我已经能够让它工作,但我不知道如何用 .so 库做类似的事情。

如何从 java 访问 .so 库中的方法?

【问题讨论】:

    标签: android android-studio android-ndk android-gradle-plugin


    【解决方案1】:

    你应该创建一个包装器 c 库:

    1.- 更改moduleName的名称以避免冲突:

    ndk {
         moduleName "gstplayerwrapper"
        }
    

    2.- 在您的活动中加载您的包装器库

    static{
    
        System.loadLibrary("EcoLogSIL");
    
    }
    

    3.- 构建您的项目

    4.- 创建一个调用包装器的函数并按 alt+intro

    5.- 你应该在 gtsplayerwrapper.c 中有一个新函数,在这里你可以调用 libgstplayer.so

    JNIEXPORT void JNICALL
    Java_your_activty_name_call_1wrapper(JNIEnv *env, jobject instance) {
    
        // YOUR CODE HERE
    
    }
    

    不要忘记在 gtsplayerwrapper.c 中导入库

    编辑添加标题

    repositories {
            prebuilt(PrebuiltLibraries) {
                gstplayer {
                    headers.srcDir "src/main/jni/include"
                    binaries.withType(SharedLibraryBinary) {
                        sharedLibraryFile = file("libs/libgstplayer.so")
                        sharedLibraryFile = file("libs/libgstreamer_android.so")
                    }
                }
            }
        }
    

    在您的项目中创建此文件夹并复制 .h 文件

    【讨论】:

    • 这听起来不错,但我正在努力的部分是将库导入 gstplayerwrapper.c 并调用 libgstplayer.so
    • 我看到的第一个错误是你没有在gradle文件中添加你的库的标题。
    • .so 库非常广泛,是我不太熟悉的第三方库。我怎么知道我需要哪些 .h 文件?这个图书馆有数百个。我从第三方库中添加了“include”目录,当我在 Android Studio 中制作时,会出现大量#include 错误。无论出于何种原因,在命令行中使用 ndk-build 构建成功,但是当我将这些 .h 文件添加到我的 jni 并在 Android Studio 中构建时,如果 <example.h> 引用文件夹中的其他文件,则无法找到它们。
    • 为了用一个例子澄清我最后的评论,我在我的gstplayerwrapper.c 中包含了一个文件gstplayer.h。为此,我将gstplayer.h 带入我的 src/main/jni/include 文件夹。 gstplayer.h 有一行 #include <gst/gst.h> 其中 gst.h 应该在我的 jniLibs 中的 2 个 .so 文件中的至少一个中,但是当我构建时出现错误 gst/gst.h: No such文件或目录
    • 您查看过第三方图书馆网站吗?它没有使用实验性 gradle,但也许你可以弄清楚如何去做或在那里问:docs.gstreamer.com/display/GstSDK/…
    猜你喜欢
    • 2016-06-07
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    相关资源
    最近更新 更多