我有一个为Android构建的现有C库。我现在需要使用JNI与它进行交互。 SWIG似乎是一种聪明的方法。但是,我可以找到所有SWIG示例构建c代码到一个库中,然后由SWIG包装。
我拥有我所拥有的库的所有标题,这是SWIG完成其工作所必需的,但我无法弄清楚如何在Android Studio的构建过程中包含该库。
gradle构建文件对于one example project看起来像这样,但我不知道如何将构建的.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"
}
}
答案 0 :(得分:1)
您使用的示例代码是我的,所以也许我可以提供帮助:)
库本身静态加载到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