gpt4 book ai didi

android-studio - 如果我有 header ,如何使用 SWIG 包装现有的 C 库以与 Android Studio 一起使用?

转载 作者:行者123 更新时间:2023-12-03 17:25:57 25 4
gpt4 key购买 nike

我有一个为 Android 构建的现有 C 库。我现在需要使用 JNI 与它交互。 SWIG 似乎是一种聪明的方式来做到这一点。但是我能找到的所有 SWIG 示例都将 C 代码构建到库中,然后由 SWIG 包装。

我拥有我所拥有的库的所有 header ,这是 SWIG 完成其工作所必需的,但我不知道如何将库包含在 Android Studio 的构建过程中。

one example project 的 gradle 构建文件看起来像这样,但我不明白它是如何知道将构建的 .so 文件包含到项目中的。

apply plugin: 'com.android.application'

android {
compileSdkVersion 21
buildToolsVersion "21.1.2"

defaultConfig {
applicationId "com.sureshjoshi.android.ndkexample"
minSdkVersion 15
targetSdkVersion 21
versionCode 1
versionName "1.0"

ndk {
moduleName "SeePlusPlus" // Name of C++ module (i.e. libSeePlusPlus)
cFlags "-std=c++11 -fexceptions" // Add provisions to allow C++11 functionality
stl "gnustl_shared" // Which STL library to use: gnustl or stlport
}
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:21.0.3'
compile 'com.jakewharton:butterknife:6.0.0'
}

// Location of where to store the jni wrapped files
def coreWrapperDir = new File("${projectDir}/src/main/java/com/sureshjoshi/core")

task createCoreWrapperDir {
coreWrapperDir.mkdirs()
}

// For this to work, it's assumed SWIG is installed
// TODO: This only works when called from Command Line (gradlew runSwig)
task runSwig(type:Exec, dependsOn: ['createCoreWrapperDir']) {

String osName = System.getProperty("os.name").toLowerCase();
if (osName.contains("windows")) {
workingDir '/src/main/jni' // This implicitly starts from $(projectDir) evidently
commandLine 'cmd', '/c', 'swig'
args '-c++', '-java', '-package', 'com.sureshjoshi.core', '-outdir', coreWrapperDir.absolutePath, 'SeePlusPlus.i'
}
else {
commandLine 'swig'
args '-c++', '-java', '-package', 'com.sureshjoshi.core', '-outdir', coreWrapperDir.absolutePath, "${projectDir}/src/main/jni/SeePlusPlus.i"
}

}

最佳答案

您使用的示例代码是我的,所以也许我可以提供帮助:)

库本身被静态加载到 MainActivity(或 MainApplication,无论什么)中的项目中。确保您的库位于正确的位置

static {
// Use the same name as defined in app.gradle (do not add the 'lib' or the '.so')
System.loadLibrary("SeePlusPlus");
}

在我的 NDK 示例中,您会在构建后看到 .so 文件最终位于 android-ndk-swig-example/NDKExample/app/build/intermediates/ndk/debug/lib/

如果您有自己的 .so 文件,我相信它们需要进入 app/src/main/jniLibs/[architecture] 文件夹...您可以将它们放在那里,然后尝试 loadLibrary,如果应用崩溃,这是不正确的。

同样,查看这个答案——特别是关于源集的讨论(默认应该是 jniLibs,但你可以修改它):https://stackoverflow.com/a/26693354/992509

关于android-studio - 如果我有 header ,如何使用 SWIG 包装现有的 C 库以与 Android Studio 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30110579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com