13

我正在使用 sqlite4java 开始一个简单的 java 测试项目并使用 java 构建。

我可以轻松下载核心 sqlite4java 库,但我不确定让 gradle 下载本机库并将它们放在正确位置的最佳(任何!)方法。

这是我的 build.gradle 文件:

apply plugin: 'java'

/* We use Java 1.7 */
sourceCompatibility = 1.7
targetCompatibility = 1.7
version = '1.0'

repositories {
    mavenCentral()
}

sourceSets {
    main {
        java.srcDir 'src'
        output.classesDir = 'build/main'
    }
    test {
        java.srcDir 'test'
        output.classesDir = 'build/test'
    }
}


dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    compile "com.almworks.sqlite4java:sqlite4java:1.0.392"
    compile "com.almworks.sqlite4java:libsqlite4java-osx:1.0.392"
}

但是当我运行一个简单的测试时,我得到:

TestTest > testSqlite4Basic FAILED
    com.almworks.sqlite4java.SQLiteException at TestTest.java:15
        Caused by: java.lang.UnsatisfiedLinkError at TestTest.java:15

(我是从 IntelliJ 内部构建的,但我使用的是 gradle 构建选项 - 所以我认为运行测试时不是 ItelliJ 填充了类路径......)

我很确定我第一次尝试构建时收到了一些关于无法解压缩 libsqlite4java-osx ZIP 文件的消息(并不奇怪,因为 maven Central 说它是一个 dylib 文件)。

我需要做什么才能让 gradle 做正确的事?

旁白:我可以通过手动将从 maven 缓存中下载的内容复制到我(我认为我在我的 mac 上使用过).dylib中列出的某个地方来运行代码。但这似乎与将所有设置和依赖项打包在文件中的全部意义相反,并且不会让我以后轻松分发任何东西。java.library.path$HOME/Library/Java/Extensions.gradle

4

4 回答 4

6

我想,您需要使用额外的 gradle 插件来处理本机库或执行您自己的特定任务,上传本机库并将其放置在正确的位置,以便可以找到和链接它们。

目前我只知道一个这样的插件,希望它能解决你的问题https://github.com/cjstehno/gradle-natives

编辑: 在您的情况下,插件的问题在于,您的依赖“com.almworks.sqlite4java:libsqlite4java-osx:1.0.392”本身就是本机库,而不是我认为的包含本机库的罐子。因此,在这种情况下,您可以简单地将这个依赖项添加到构建脚本的依赖项部分中,因为它已经完成,然后创建一个自定义复制任务,将其放在您需要的任何地方。尝试在 Win7 上使用 gradle 2.6 执行此操作,如下所示:

task copyNtiveDeps(type: Copy) {
  from (configurations.compile+configurations.testCompile) {
    include "libsqlite4java-osx-1.0.392.dylib"
  }
  into "c:\\tmp"
}

在您的情况下,您只需将“into”属性设置为 java.library.path 中的某个路径。其次,您可以使用 gradle 任务属性 dependsOn 和 mustRunAfter 使该任务自动运行。

于 2015-09-03T04:22:11.983 回答
6

这是基于斯坦尼斯拉夫评论的完整答案。

apply plugin: 'java'

/* We use Java 1.8 */
sourceCompatibility = 1.8
targetCompatibility = 1.8
version = '1.0'

repositories { mavenCentral() }

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    compile "com.almworks.sqlite4java:sqlite4java:1.0.392"
    compile "com.almworks.sqlite4java:libsqlite4java-osx:1.0.392"
}

sourceSets {
    main {
        java.srcDir 'src'
        output.classesDir = 'build/main'
    }
    test {
        java.srcDir 'test'
        output.classesDir = 'build/test'
    }
}

/* Copy the native files */
task copyNativeDeps(type: Copy) {
    from (configurations.compile+configurations.testCompile) {
        include "*.dylib"
    }
    into 'build/libs'
}

/* Make sure we setup the tests to actually copy 
 * the native files and set the paths correctly. */
test {
    dependsOn copyNativeDeps
    systemProperty "java.library.path", 'build/libs'
}

并为其运行示例测试源:

import com.almworks.sqlite4java.SQLiteConnection;
import com.almworks.sqlite4java.SQLiteStatement;
import org.junit.Test;

import java.io.File;

public class SqliteTest {

    @Test public void aTest() throws Exception {
        SQLiteConnection db = new SQLiteConnection(new File("/tmp/database"));
        db.open(true);  

        SQLiteStatement st = db.prepare("SELECT name FROM dummy");
        try {
            while(st.step()) {
                System.err.printf("name = %s\n", st.columnString(1));
            }
        } finally {
            st.dispose();
        }
    }
}
于 2015-09-15T02:45:44.027 回答
0

我使用这种方法在 anroid studio 3.1.4 中设置 sqlite4java。

首先从这个链接下载库: https ://bitbucket.org/almworks/sqlite4java

下载将包含一个 zip 文件,其中包含一个名为 android 的文件夹以及其他 .jar 、 .so 和 .dll 文件。

将android中的三个文件夹,即'armeabi'、'armeabi-v7a'和'x86'复制到一个名为'jniLibs'的文件夹中。

将上述文件夹(即“jniLibs”)复制到您的项目/应用程序/src/main/ 文件夹中。

然后实现java4sqlite的gradle依赖:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "your.project.name"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}




dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.android.support:design:26.1.0'
    implementation 'com.readystatesoftware.sqliteasset:sqliteassethelper:2.0.1'
    implementation "com.almworks.sqlite4java:sqlite4java:1.0.392"
    implementation "com.almworks.sqlite4java:libsqlite4java-osx:1.0.392"
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'


}
于 2019-03-04T04:02:52.587 回答
0

要编译自己的 sqlite3 库,可以查看github android-sqlite3

对于当前的 Android Studio (3.3.1),您可以简单地在.so里面添加文件,app/build.gradle如下所示:

android {
    ...

    sourceSets {
        main {
            jniLibs.srcDirs += ['<your-path>/your-libs']
        }
    }

    ...
}

解释

jniLibs.srcDirs是指向 jni 库的 gradle 路径,操作符+=表示除了里面的默认库之外的其他 jni 库app/src/main/jniLibs,如下所示:

app/
├──libs/
|  └── *.jar           <-- java libs
├──src/
   └── main/
       ├── AndroidManifest.xml
       ├── java/
       └── jniLibs/    <-- default directory for jni libs, i.e. <ANDROID_ABI>/**.so

请注意,jni 库必须根据 android ABI 进行组织,即

your-libs/
├── arm64-v8a/                       <-- ARM 64bit
│   └── lib-your-abc.so
├── armeabi-v7a/                     <-- ARM 32bit
│   └── lib-your-abc.so
├── x86_64/                          <-- Intel 64bit
│   └── lib-your-abc.so
└── x86/                             <-- Intel 32bit
    └── lib-your-abc.so

于 2019-03-04T05:43:18.877 回答