android jni 静态库,将静态库链接到Android中的JNI共享库

我是

Android新手,请原谅我,如果这看起来有点不成熟.我有两个预先构建的静态库,feta(../../feta/build/libfeta.a)和mish(../../mish/build/libmish.a),我有共享的JNI库.使用JNI库工作得很好,但我试图通过JNI库访问feta和mish.这两个库随着Android项目的不断变化和更新,因此每次构建它们时复制它们实际上都不是一个选项(如果这甚至可以解决链接问题),我不太喜欢简单地复制它们将源文件导入Android项目.

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

我试图在各种设置中使用来自十几个教程和Stackoverflow答案的所有配置,但没有运气.

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

我刚刚按照this教程后问过这个问题,所以所有文件都会反映出来.

这是我得到的构建错误:

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文件:

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)目录之一:

// 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:

# 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} )

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

fbf1e4c1b023b4b5fd5d7efb9ed35e7a.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值