首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将静态库链接到Android中的JNI共享库

将静态库链接到Android中的JNI共享库
EN

Stack Overflow用户
提问于 2017-01-03 23:03:07
回答 0查看 2.6K关注 0票数 6

我是Android的新手,所以如果这看起来有点成熟,请原谅我。我有两个预先构建的静态库,feta (../../feta/build/libfeta.a)和mish (../../mish/build/libmish.a),我还有一个共享的JNI库。使用JNI库可以很好地工作,但我正在尝试通过JNI库访问fetamish。这两个库随着Android项目而不断变化和更新,所以每次构建它们时复制它们都不是一个真正的选择(如果这样可以解决链接问题的话),我也不喜欢简单地将源文件复制到Android项目中。

我尝试过搜索,但大多数答案都使用旧版本的系统,并希望我修改Android.mk,而我没有。我使用的是Android Studio的最新版本,它使用Gradle插件。

我尝试过在不同的设置中使用十几个教程和Stackoverflow答案中的所有配置,但都没有成功。

如果你回答了,请提供一个完整的有效的build.gradle,这样我就不会遇到和其他答案一样的问题了(谢谢!)

我在刚看完this教程后问了这个问题,所以所有的文件都会反映出来。

下面是我得到的构建错误:

代码语言:javascript
复制
Error:A problem occurred configuring project ':app'.
> The following model rules could not be applied due to unbound inputs and/or subjects:
    android.sources { ... } @ app/build.gradle line 58, column 5
      subject:
        - android.sources Object [*]
    repositories { ... } @ app/build.gradle line 39, column 5
      subject:
        - repositories Object [*]
  [*] - indicates that a model item could not be found for the path or type.

下面是我在app模块中的build.gradle文件:

代码语言:javascript
复制
apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.neonorb.mish_android"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags "-std=c++14 -Wno-implicit-exception-spec-mismatch"
            }
        }
        ndk {
            // ${targetPlatform.getName()}
            // ${buildType.getName()}
            stl "c++_static"
            abiFilters "x86_64"
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

model {
    repositories {
        libs(PrebuiltLibraries) {
            feta {
                headers.srcDir "../../feta/include/"
                binaries.withType(StaticLibraryBinary) {
                    staticLibraryFile = file("../../feta/build/libfeta.a")
                }
            }
        }
        libs(PrebuiltLibraries) {
            mish {
                headers.srcDir "../../mish/include/"
                binaries.withType(StaticLibraryBinary) {
                    staticLibraryFile = file("../../mish/build/libmish.a")
                }
            }
        }
    }

    android.sources {
        main {
            jni {
                dependencies {
                    library "feta" linkage "static"
                    library "mish" linkage "static"
                }
            }
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    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.1.0'
    compile 'com.google.android.gms:play-services-ads:10.0.1'
    compile 'com.android.support:design:25.1.0'
    testCompile 'junit:junit:4.12'
}

下面是根目录(mish-android):

代码语言:javascript
复制
// 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:2.2.3'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

这是我的CMakeLists.txt

代码语言:javascript
复制
# Sets the minimum version of CMake required to build the native
# library. You should either keep the default value or only pass a
# value of 3.4.0 or lower.

cmake_minimum_required(VERSION 3.4.1)

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds it for you.
# Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.
             mish-android

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             # Associated headers in the same location as their source
             # file are automatically included.
             src/main/cpp/mish.cpp )

# Searches for a specified prebuilt library and stores the path as a
# variable. Because system libraries are included in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in the
# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.
                       mish-android

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

这是我的目录结构,如果它有帮助的话。

EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41446393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档