我正在使用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做正确的事?
ASIDE :我可以通过手动将已下载的.dylib
从maven缓存复制到我的java.library.path
中列出的位置来运行代码(想想我用过我的mac上$HOME/Library/Java/Extensions
。但这似乎与在.gradle
文件中打包所有设置和依赖关系的整个观点相悖,并且不会让我稍后轻易分发任何内容。
答案 0 :(得分:6)
我想,您需要使用额外的gradle插件来处理本机库或制作您自己的特定任务,以便将原生库上传并放置在正确的位置,以便找到并链接它们。
目前我只知道一个这样的插件,希望它能解决你的问题https://github.com/cjstehno/gradle-natives
修改强> 在您的情况下插件的问题是,您的dependecny“com.almworks.sqlite4java:libsqlite4java-osx:1.0.392”本身就是本机lib,而不是像我想的那样包含本机库的jar。因此,在这种情况下,您可以简单地在构建脚本的依赖项中添加此依赖项,因为它已经完成,然后创建自定义复制任务,将其放在您需要的任何位置。尝试使用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自动运行此任务。
答案 1 :(得分:5)
根据斯坦尼斯拉夫的评论,这是一个完整的答案。
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();
}
}
}
答案 2 :(得分:0)
我使用这种方法在anroid studio 3.1.4中设置sqlite4java。
首先从此链接下载库: https://bitbucket.org/almworks/sqlite4java
下载内容将包含一个zip文件,其中包含一个名为android的文件夹以及其他.jar,.so和.dll文件。
将android中的三个文件夹(即“ armeabi”,“ armeabi-v7a”和“ x86”)复制到名为“ jniLibs”的文件夹中。
将上述文件夹“ jniLibs”复制到yourproject / app / 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'
}
答案 3 :(得分:0)
要编译自己的sqlite3库,可以检查weekday
对于当前的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