From: stephan Date: Fri, 1 Sep 2023 09:43:56 +0000 (+0000) Subject: JNI build improvements. Rename a Java class. Get the jar target working again. X-Git-Tag: version-3.44.0~216^2~30 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=55171a75ef01eb4dcaebb14e9eb8facecc284327;p=thirdparty%2Fsqlite.git JNI build improvements. Rename a Java class. Get the jar target working again. FossilOrigin-Name: d086b7844cace5c997261c97565aeef62aaeeef727ccc7e83f17c54d6217b779 --- diff --git a/ext/jni/GNUmakefile b/ext/jni/GNUmakefile index fe53f36a03..02998569a2 100644 --- a/ext/jni/GNUmakefile +++ b/ext/jni/GNUmakefile @@ -31,6 +31,13 @@ mkdir := mkdir -p $(dir.bld.c): $(mkdir) $@ +javac.flags ?= -Xlint:unchecked -Xlint:deprecation +java.flags ?= +jnicheck ?= 1 +ifeq (1,$(jnicheck)) + java.flags += -Xcheck:jni +endif + classpath := $(dir.src) CLEAN_FILES := $(package.jar) DISTCLEAN_FILES := $(dir.jni)/*~ $(dir.src.c)/*~ $(dir.src.jni)/*~ @@ -47,7 +54,7 @@ SQLTester.class := $(SQLTester.java:.java=.class) # It would be a real doozy to bind to JNI. enable.fts5 ?= 1 # If enable.tester is 0, the org/sqlite/jni/tester/* bits are elided. -enable.tester ?= 1 +enable.tester ?= $(if $(wildcard $(dir.src.jni.tester)/SQLTester.java),1,0) # bin.version-info = binary to output various sqlite3 version info # building the distribution zip file. @@ -62,7 +69,6 @@ JAVA_FILES.main := $(patsubst %,$(dir.src.jni)/%,\ annotation/Canonical.java \ annotation/NotNull.java \ annotation/Nullable.java \ - annotation/package-info.java \ AbstractCollationCallback.java \ AggregateFunction.java \ AuthorizerCallback.java \ @@ -80,20 +86,22 @@ JAVA_FILES.main := $(patsubst %,$(dir.src.jni)/%,\ RollbackHookCallback.java \ ScalarFunction.java \ SQLFunction.java \ + CallbackProxy.java \ SQLite3Jni.java \ TableColumnMetadata.java \ - Tester1.java \ TraceV2Callback.java \ UpdateHookCallback.java \ ValueHolder.java \ WindowFunction.java \ XDestroyCallback.java \ - package-info.java \ sqlite3.java \ sqlite3_context.java \ sqlite3_stmt.java \ sqlite3_value.java \ ) +JAVA_FILES.unittest := $(patsubst %,$(dir.src.jni)/%,\ + Tester1.java \ +) ifeq (1,$(enable.fts5)) JAVA_FILES.main += $(patsubst %,$(dir.src.jni)/%,\ fts5_api.java \ @@ -109,32 +117,30 @@ ifeq (1,$(enable.fts5)) ) endif JAVA_FILES.tester := $(dir.src.jni.tester)/SQLTester.java +JAVA_FILES.package.info := \ + $(dir.src.jni)/package-info.java \ + $(dir.src.jni)/annotation/package-info.java CLASS_FILES.main := $(JAVA_FILES.main:.java=.class) +CLASS_FILES.unittest := $(JAVA_FILES.unittest:.java=.class) CLASS_FILES.tester := $(JAVA_FILES.tester:.java=.class) -JAVA_FILES += $(JAVA_FILES.main) +JAVA_FILES += $(JAVA_FILES.main) $(JAVA_FILES.unittest) ifeq (1,$(enable.tester)) JAVA_FILES += $(JAVA_FILES.tester) endif CLASS_FILES := -define DOTCLASS_DEPS -$(1).class: $(1).java $(MAKEFILE) +define CLASSFILE_DEPS all: $(1).class CLASS_FILES += $(1).class endef -$(foreach B,$(basename $(JAVA_FILES)),$(eval $(call DOTCLASS_DEPS,$(B)))) -$(CLASS_FILES.tester): $(CLASS_FILES.main) -javac.flags ?= -Xlint:unchecked -Xlint:deprecation -java.flags ?= -jnicheck ?= 1 -ifeq (1,$(jnicheck)) - java.flags += -Xcheck:jni -endif -$(SQLite3Jni.class): $(JAVA_FILES) +$(foreach B,$(basename \ + $(JAVA_FILES.main) $(JAVA_FILES.unittest) $(JAVA_FILES.tester)),\ + $(eval $(call CLASSFILE_DEPS,$(B)))) +$(CLASS_FILES): $(JAVA_FILES) $(MAKEFILE) $(bin.javac) $(javac.flags) -h $(dir.bld.c) -cp $(classpath) $(JAVA_FILES) -all: $(SQLite3Jni.class) + #.PHONY: classfiles ######################################################################## @@ -199,13 +205,18 @@ endif sqlite3-jni.c := $(dir.src.c)/sqlite3-jni.c sqlite3-jni.o := $(dir.bld.c)/sqlite3-jni.o sqlite3-jni.h := $(dir.src.c)/sqlite3-jni.h -sqlite3-jni.dll := $(dir.bld.c)/libsqlite3-jni.so +package.dll := $(dir.bld.c)/libsqlite3-jni.so # All javac-generated .h files must be listed in $(sqlite3-jni.h.in): sqlite3-jni.h.in := +# $(java.with.jni) lists all Java files which contain JNI decls: +java.with.jni := define ADD_JNI_H sqlite3-jni.h.in += $$(dir.bld.c)/org_sqlite_jni_$(1).h +java.with.jni += $$(dir.src.jni)/$(1).java $$(dir.bld.c)/org_sqlite_jni_$(1).h: $$(dir.src.jni)/$(1).java endef +# Invoke ADD_JNI_H once for each Java file which includes JNI +# declarations: $(eval $(call ADD_JNI_H,SQLite3Jni)) ifeq (1,$(enable.fts5)) $(eval $(call ADD_JNI_H,Fts5ExtensionApi)) @@ -216,8 +227,10 @@ ifeq (1,$(enable.tester)) sqlite3-jni.h.in += $(dir.bld.c)/org_sqlite_jni_tester_SQLTester.h $(dir.bld.c)/org_sqlite_jni_tester_SQLTester.h: $(dir.src.jni.tester)/SQLTester.java endif -#sqlite3-jni.dll.cfiles := $(dir.src.c) -sqlite3-jni.dll.cflags = \ +$(sqlite3-jni.h.in): $(dir.bld.c) + +#package.dll.cfiles := +package.dll.cflags = \ -fPIC \ -I. \ -I$(dir $(sqlite3.h)) \ @@ -234,22 +247,30 @@ sqlite3-jni.dll.cflags = \ # include path for client-level code. ######################################################################## ifeq (1,$(enable.tester)) - sqlite3-jni.dll.cflags += -DSQLITE_JNI_ENABLE_SQLTester + package.dll.cflags += -DSQLITE_JNI_ENABLE_SQLTester endif $(sqlite3-jni.h): $(sqlite3-jni.h.in) $(MAKEFILE) - cat $(sqlite3-jni.h.in) > $@ -$(sqlite3-jni.dll): $(sqlite3-jni.h) $(sqlite3.c) $(sqlite3.h) -$(sqlite3-jni.dll): $(dir.bld.c) $(sqlite3-jni.c) $(SQLite3Jni.java) $(MAKEFILE) - $(CC) $(sqlite3-jni.dll.cflags) $(SQLITE_OPT) \ + @cat $(sqlite3-jni.h.in) > $@.tmp + @if cmp $@ $@.tmp; then \ + rm -f $@.tmp; \ + echo "$@ not modified"; \ + else \ + mv $@.tmp $@; \ + echo "Updated $@"; \ + fi + +$(package.dll): $(sqlite3-jni.h) $(sqlite3.c) $(sqlite3.h) +$(package.dll): $(sqlite3-jni.c) $(MAKEFILE) + $(CC) $(package.dll.cflags) $(SQLITE_OPT) \ $(sqlite3-jni.c) -shared -o $@ -all: $(sqlite3-jni.dll) +all: $(package.dll) .PHONY: test test-one test.flags ?= test.main.flags = -ea -Djava.library.path=$(dir.bld.c) \ $(java.flags) -cp $(classpath) \ org.sqlite.jni.Tester1 -test.deps := $(SQLite3Jni.class) $(sqlite3-jni.dll) +test.deps := $(CLASS_FILES) $(package.dll) test-one: $(test.deps) $(bin.java) $(test.main.flags) $(test.flags) test-sqllog: $(test.deps) @@ -257,7 +278,7 @@ test-sqllog: $(test.deps) $(bin.java) $(test.main.flags) -sqllog test-mt: $(test.deps) @echo "Testing in multi-threaded mode:"; - $(bin.java) $(test.main.flags) -t 11 -r 50 -shuffle $(test.flags) + $(bin.java) $(test.main.flags) -t 7 -r 50 -shuffle $(test.flags) test: test-one test-mt tests: test test-sqllog @@ -266,7 +287,7 @@ tester.scripts := $(sort $(wildcard $(dir.src)/tests/*.test)) tester.flags ?= # --verbose .PHONY: tester tester-local tester-ext ifeq (1,$(enable.tester)) -tester-local: $(CLASS_FILES.tester) $(sqlite3-jni.dll) +tester-local: $(CLASS_FILES.tester) $(package.dll) $(bin.java) -ea -Djava.library.path=$(dir.bld.c) \ $(java.flags) -cp $(classpath) \ org.sqlite.jni.tester.SQLTester $(tester.flags) $(tester.scripts) @@ -313,16 +334,24 @@ multitest: clean # jar bundle... package.jar.in := $(abspath $(dir.src)/jar.in) CLEAN_FILES += $(package.jar.in) -$(package.jar.in): $(MAKEFILE) $(CLASS_FILES.main) - cd $(dir.src); ls -1 org/sqlite/jni/*.java org/sqlite/jni/*.class > $@ - @echo "To use this jar you will need the -Djava.library.path=DIR/CONTAINING/libsqlite3-jni.so flag." - @echo "e.g. java -jar $@ -Djava.library.path=bld" - -$(package.jar): $(CLASS_FILES) $(MAKEFILE) $(package.jar.in) - rm -f $(dir.src)/c/*~ $(dir.src.jni)/*~ +JAVA_FILES.jar := $(JAVA_FILES.main) $(JAVA_FILES.unittest) $(JAVA_FILES.package.info) +CLASS_FILES.jar := $(filter-out %/package-info.class,$(JAVA_FILES.jar:.java=.class)) +$(package.jar.in): $(package.dll) $(MAKEFILE) + ls -1 \ + $(dir.src.jni)/*.java $(dir.src.jni)/*.class \ + $(dir.src.jni)/annotation/*.java $(dir.src.jni)/annotation/*.class \ + | sed -e 's,^$(dir.src)/,,' | sort > $@ + +$(package.jar): $(CLASS_FILES.jar) $(MAKEFILE) $(package.jar.in) + @rm -f $(dir.src)/c/*~ $(dir.src.jni)/*~ cd $(dir.src); $(bin.jar) -cfe ../$@ org.sqlite.jni.Tester1 @$(package.jar.in) + @ls -la $@ + @echo "To use this jar you will need the -Djava.library.path=DIR/CONTAINING/libsqlite3-jni.so flag." + @echo "e.g. java -Djava.library.path=bld -jar $@" jar: $(package.jar) +run-jar: $(package.jar) $(package.dll) + $(bin.java) -Djava.library.path=$(dir.bld) -jar $(package.jar) $(run-jar.flags) ######################################################################## # javadoc... @@ -349,7 +378,7 @@ docserve: $(doc.index) CLEAN_FILES += $(dir.bld.c)/* \ $(dir.src.jni)/*.class \ $(dir.src.jni.tester)/*.class \ - $(sqlite3-jni.dll) \ + $(package.dll) \ hs_err_pid*.log .PHONY: clean distclean diff --git a/ext/jni/src/c/sqlite3-jni.c b/ext/jni/src/c/sqlite3-jni.c index bc15212251..8e654a1b28 100644 --- a/ext/jni/src/c/sqlite3-jni.c +++ b/ext/jni/src/c/sqlite3-jni.c @@ -266,6 +266,7 @@ static void * s3jni_realloc_or_die(JNIEnv * const env, void * p, size_t n){ #else #define s3jni_oom_check(EXPR) #endif +//#define S3JniDb_oom(pDb,EXPR) ((EXPR) ? sqlite3OomFault(pDb) : 0) /* Helpers for Java value reference management. */ static jobject s3jni_ref_global(JNIEnv * const env, jobject const v){ @@ -317,8 +318,8 @@ static const struct { const S3JniNphRef OutputPointer_sqlite3; const S3JniNphRef OutputPointer_sqlite3_stmt; const S3JniNphRef OutputPointer_sqlite3_value; -#ifdef SQLITE_ENABLE_FTS5 const S3JniNphRef OutputPointer_String; +#ifdef SQLITE_ENABLE_FTS5 const S3JniNphRef OutputPointer_ByteArray; const S3JniNphRef Fts5Context; const S3JniNphRef Fts5ExtensionApi; @@ -346,8 +347,8 @@ static const struct { "Lorg/sqlite/jni/sqlite3_stmt;"), RefO(9, "OutputPointer$sqlite3_value", "Lorg/sqlite/jni/sqlite3_value;"), -#ifdef SQLITE_ENABLE_FTS5 RefO(10, "OutputPointer$String", "Ljava/lang/String;"), +#ifdef SQLITE_ENABLE_FTS5 RefO(11, "OutputPointer$ByteArray", "[B"), RefN(12, "Fts5Context"), RefN(13, "Fts5ExtensionApi"), @@ -413,6 +414,10 @@ static const S3JniHook S3JniHook_empty = {0,0,0,0,0}; ** Per-(sqlite3*) state for various JNI bindings. This state is ** allocated as needed, cleaned up in sqlite3_close(_v2)(), and ** recycled when possible. +** +** Trivia: vars and parameters of this type are often named "ps" +** because this class used to have a name for which that abbreviation +** made sense. */ typedef struct S3JniDb S3JniDb; struct S3JniDb { @@ -453,6 +458,10 @@ static const char * const S3JniDb_clientdata_key = "S3JniDb"; /* ** Cache for per-JNIEnv (i.e. per-thread) data. +** +** Trivia: vars and parameters of this type are often named "jc" +** because this class used to have a name for which that abbreviation +** made sense. */ typedef struct S3JniEnv S3JniEnv; struct S3JniEnv { @@ -1460,11 +1469,8 @@ static S3JniDb * S3JniDb_alloc(JNIEnv * const env, jobject jDb){ ** from it, or no matching entry can be found. */ static S3JniDb * S3JniDb__from_java(JNIEnv * const env, jobject jDb){ - S3JniDb * s = 0; - sqlite3 * pDb = 0; - if( jDb ) pDb = PtrGet_sqlite3(jDb); - s = S3JniDb_from_clientdata(pDb); - return s; + sqlite3 * const pDb = jDb ? PtrGet_sqlite3(jDb) : 0; + return pDb ? S3JniDb_from_clientdata(pDb) : 0; } #define S3JniDb_from_java(jObject) S3JniDb__from_java(env,(jObject)) @@ -4259,7 +4265,7 @@ S3JniApi(sqlite3_trace_v2(),jint,1trace_1v2)( rc = sqlite3_trace_v2(ps->pDb, (unsigned)traceMask, s3jni_trace_impl, ps); if( 0==rc ){ S3JniHook_unref(&ps->hooks.trace); - ps->hooks.trace = hook; + ps->hooks.trace = hook /* transfer ownership of reference */; }else{ S3JniHook_unref(&hook); } diff --git a/ext/jni/src/org/sqlite/jni/AuthorizerCallback.java b/ext/jni/src/org/sqlite/jni/AuthorizerCallback.java index a9f15fc6c2..6dbd9cb77b 100644 --- a/ext/jni/src/org/sqlite/jni/AuthorizerCallback.java +++ b/ext/jni/src/org/sqlite/jni/AuthorizerCallback.java @@ -17,7 +17,7 @@ import org.sqlite.jni.annotation.*; /** Callback for use with {@link SQLite3Jni#sqlite3_set_authorizer}. */ -public interface AuthorizerCallback extends SQLite3CallbackProxy { +public interface AuthorizerCallback extends CallbackProxy { /** Must function as described for the C-level sqlite3_set_authorizer() callback. diff --git a/ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java b/ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java index 1f8ace2fb8..4a36941306 100644 --- a/ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java +++ b/ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java @@ -17,7 +17,7 @@ package org.sqlite.jni; Callback for use with the {@link SQLite3Jni#sqlite3_auto_extension} family of APIs. */ -public interface AutoExtensionCallback extends SQLite3CallbackProxy { +public interface AutoExtensionCallback extends CallbackProxy { /** Must function as described for a C-level sqlite3_auto_extension() callback. diff --git a/ext/jni/src/org/sqlite/jni/BusyHandlerCallback.java b/ext/jni/src/org/sqlite/jni/BusyHandlerCallback.java index db9295bb61..30a5edc037 100644 --- a/ext/jni/src/org/sqlite/jni/BusyHandlerCallback.java +++ b/ext/jni/src/org/sqlite/jni/BusyHandlerCallback.java @@ -16,7 +16,7 @@ package org.sqlite.jni; /** Callback for use with {@link SQLite3Jni#sqlite3_busy_handler}. */ -public interface BusyHandlerCallback extends SQLite3CallbackProxy { +public interface BusyHandlerCallback extends CallbackProxy { /** Must function as documented for the C-level sqlite3_busy_handler() callback argument, minus the (void*) diff --git a/ext/jni/src/org/sqlite/jni/SQLite3CallbackProxy.java b/ext/jni/src/org/sqlite/jni/CallbackProxy.java similarity index 97% rename from ext/jni/src/org/sqlite/jni/SQLite3CallbackProxy.java rename to ext/jni/src/org/sqlite/jni/CallbackProxy.java index 5052664937..086c2f8e5d 100644 --- a/ext/jni/src/org/sqlite/jni/SQLite3CallbackProxy.java +++ b/ext/jni/src/org/sqlite/jni/CallbackProxy.java @@ -41,4 +41,4 @@ package org.sqlite.jni;

2) They all have a {@code call()} method but its signature is callback-specific. */ -public interface SQLite3CallbackProxy {} +public interface CallbackProxy {} diff --git a/ext/jni/src/org/sqlite/jni/CollationCallback.java b/ext/jni/src/org/sqlite/jni/CollationCallback.java index 481c6cd956..7f0e79a3fa 100644 --- a/ext/jni/src/org/sqlite/jni/CollationCallback.java +++ b/ext/jni/src/org/sqlite/jni/CollationCallback.java @@ -20,7 +20,7 @@ import org.sqlite.jni.annotation.NotNull; @see AbstractCollationCallback */ public interface CollationCallback - extends SQLite3CallbackProxy, XDestroyCallback { + extends CallbackProxy, XDestroyCallback { /** Must compare the given byte arrays and return the result using {@code memcmp()} semantics. diff --git a/ext/jni/src/org/sqlite/jni/CollationNeededCallback.java b/ext/jni/src/org/sqlite/jni/CollationNeededCallback.java index e6c917a2c2..b72cf1ba53 100644 --- a/ext/jni/src/org/sqlite/jni/CollationNeededCallback.java +++ b/ext/jni/src/org/sqlite/jni/CollationNeededCallback.java @@ -16,7 +16,7 @@ package org.sqlite.jni; /** Callback for use with {@link SQLite3Jni#sqlite3_collation_needed}. */ -public interface CollationNeededCallback extends SQLite3CallbackProxy { +public interface CollationNeededCallback extends CallbackProxy { /** Has the same semantics as the C-level sqlite3_create_collation() callback. diff --git a/ext/jni/src/org/sqlite/jni/CommitHookCallback.java b/ext/jni/src/org/sqlite/jni/CommitHookCallback.java index 253d0b8cfa..2e9a68d25d 100644 --- a/ext/jni/src/org/sqlite/jni/CommitHookCallback.java +++ b/ext/jni/src/org/sqlite/jni/CommitHookCallback.java @@ -16,7 +16,7 @@ package org.sqlite.jni; /** Callback for use with {@link SQLite3Jni#sqlite3_commit_hook}. */ -public interface CommitHookCallback extends SQLite3CallbackProxy { +public interface CommitHookCallback extends CallbackProxy { /** Works as documented for the C-level sqlite3_commit_hook() callback. Must not throw. diff --git a/ext/jni/src/org/sqlite/jni/PreupdateHookCallback.java b/ext/jni/src/org/sqlite/jni/PreupdateHookCallback.java index b68dd4b6d4..a606139328 100644 --- a/ext/jni/src/org/sqlite/jni/PreupdateHookCallback.java +++ b/ext/jni/src/org/sqlite/jni/PreupdateHookCallback.java @@ -16,7 +16,7 @@ package org.sqlite.jni; /** Callback for use with {@link SQLite3Jni#sqlite3_preupdate_hook}. */ -public interface PreupdateHookCallback extends SQLite3CallbackProxy { +public interface PreupdateHookCallback extends CallbackProxy { /** Must function as described for the C-level sqlite3_preupdate_hook() callback. diff --git a/ext/jni/src/org/sqlite/jni/ProgressHandlerCallback.java b/ext/jni/src/org/sqlite/jni/ProgressHandlerCallback.java index d15bf31a11..bc15377037 100644 --- a/ext/jni/src/org/sqlite/jni/ProgressHandlerCallback.java +++ b/ext/jni/src/org/sqlite/jni/ProgressHandlerCallback.java @@ -16,7 +16,7 @@ package org.sqlite.jni; /** Callback for use with {@link SQLite3Jni#sqlite3_progress_handler}. */ -public interface ProgressHandlerCallback extends SQLite3CallbackProxy { +public interface ProgressHandlerCallback extends CallbackProxy { /** Works as documented for the C-level sqlite3_progress_handler() callback. diff --git a/ext/jni/src/org/sqlite/jni/RollbackHookCallback.java b/ext/jni/src/org/sqlite/jni/RollbackHookCallback.java index 3bf9f79a1a..21600c8057 100644 --- a/ext/jni/src/org/sqlite/jni/RollbackHookCallback.java +++ b/ext/jni/src/org/sqlite/jni/RollbackHookCallback.java @@ -16,7 +16,7 @@ package org.sqlite.jni; /** Callback for use with {@link SQLite3Jni#sqlite3_rollback_hook}. */ -public interface RollbackHookCallback extends SQLite3CallbackProxy { +public interface RollbackHookCallback extends CallbackProxy { /** Works as documented for the C-level sqlite3_rollback_hook() callback. diff --git a/ext/jni/src/org/sqlite/jni/Tester1.java b/ext/jni/src/org/sqlite/jni/Tester1.java index 4bd7e42ed6..f47b5944a4 100644 --- a/ext/jni/src/org/sqlite/jni/Tester1.java +++ b/ext/jni/src/org/sqlite/jni/Tester1.java @@ -74,9 +74,15 @@ public class Tester1 implements Runnable { } } - public synchronized static void outln(Object val){ + public synchronized static void outPrefix(){ if( !quietMode ){ System.out.print(Thread.currentThread().getName()+": "); + } + } + + public synchronized static void outln(Object val){ + if( !quietMode ){ + outPrefix(); System.out.println(val); } } @@ -90,7 +96,7 @@ public class Tester1 implements Runnable { @SuppressWarnings("unchecked") public synchronized static void out(Object... vals){ if( !quietMode ){ - System.out.print(Thread.currentThread().getName()+": "); + outPrefix(); for(Object v : vals) out(v); } } @@ -429,7 +435,7 @@ public class Tester1 implements Runnable { sqlite3 db = createNewDb(); execSql(db, "CREATE TABLE t(a)"); sqlite3_stmt stmt = prepare(db, "INSERT INTO t(a) VALUES(?);"); - String[] list1 = { "hell🤩", "w😃rld", "!" }; + String[] list1 = { "hell🤩", "w😃rld", "!🤩" }; int rc; int n = 0; for( String e : list1 ){ @@ -450,14 +456,16 @@ public class Tester1 implements Runnable { final String txt = sqlite3_column_text16(stmt, 0); sbuf.append( txt ); affirm( txt.equals(sqlite3_column_text(stmt, 0)) ); + affirm( txt.length() < sqlite3_value_bytes(sv) ); affirm( txt.equals(sqlite3_value_text(sv)) ); + affirm( txt.length() == sqlite3_value_bytes16(sv)/2 ); affirm( txt.equals(sqlite3_value_text16(sv)) ); sqlite3_value_free(sv); ++n; } sqlite3_finalize(stmt); affirm(3 == n); - affirm("w😃rldhell🤩!".equals(sbuf.toString())); + affirm("w😃rldhell🤩!🤩".equals(sbuf.toString())); sqlite3_close_v2(db); } @@ -1655,18 +1663,20 @@ public class Tester1 implements Runnable { sqlite3_libversion_number(),"\n", sqlite3_libversion(),"\n",SQLITE_SOURCE_ID,"\n", "SQLITE_THREADSAFE=",SQLITE_THREADSAFE); - outln("Running ",nRepeat," loop(s) with ",nThread," thread(s) each."); + final boolean showLoopCount = (nRepeat>1 && nThread>1); + if( showLoopCount ){ + outln("Running ",nRepeat," loop(s) with ",nThread," thread(s) each."); + } if( takeNaps ) outln("Napping between tests is enabled."); for( int n = 0; n < nRepeat; ++n ){ ++nLoop; - out((1==nLoop ? "" : " ")+nLoop); + if( showLoopCount ) out((1==nLoop ? "" : " ")+nLoop); if( nThread<=1 ){ new Tester1(0).runTests(false); continue; } Tester1.mtMode = true; final ExecutorService ex = Executors.newFixedThreadPool( nThread ); - //final List> futures = new ArrayList<>(); for( int i = 0; i < nThread; ++i ){ ex.submit( new Tester1(i), i ); } @@ -1689,7 +1699,7 @@ public class Tester1 implements Runnable { if( null!=err ) throw err; } } - outln(); + if( showLoopCount ) outln(); quietMode = false; final long timeEnd = System.currentTimeMillis(); @@ -1706,7 +1716,7 @@ public class Tester1 implements Runnable { final java.lang.reflect.Method[] declaredMethods = SQLite3Jni.class.getDeclaredMethods(); for(java.lang.reflect.Method m : declaredMethods){ - int mod = m.getModifiers(); + final int mod = m.getModifiers(); if( 0!=(mod & java.lang.reflect.Modifier.STATIC) ){ final String name = m.getName(); if(name.startsWith("sqlite3_")){ diff --git a/ext/jni/src/org/sqlite/jni/TraceV2Callback.java b/ext/jni/src/org/sqlite/jni/TraceV2Callback.java index 897aeefa9f..4e69bd8756 100644 --- a/ext/jni/src/org/sqlite/jni/TraceV2Callback.java +++ b/ext/jni/src/org/sqlite/jni/TraceV2Callback.java @@ -17,7 +17,7 @@ import org.sqlite.jni.annotation.Nullable; /** Callback for use with {@link SQLite3Jni#sqlite3_trace_v2}. */ -public interface TraceV2Callback extends SQLite3CallbackProxy { +public interface TraceV2Callback extends CallbackProxy { /** Called by sqlite3 for various tracing operations, as per sqlite3_trace_v2(). Note that this interface elides the 2nd diff --git a/ext/jni/src/org/sqlite/jni/UpdateHookCallback.java b/ext/jni/src/org/sqlite/jni/UpdateHookCallback.java index 4fd0a63240..4d6afb887f 100644 --- a/ext/jni/src/org/sqlite/jni/UpdateHookCallback.java +++ b/ext/jni/src/org/sqlite/jni/UpdateHookCallback.java @@ -16,7 +16,7 @@ package org.sqlite.jni; /** Callback for use with {@link SQLite3Jni#sqlite3_update_hook}. */ -public interface UpdateHookCallback extends SQLite3CallbackProxy { +public interface UpdateHookCallback extends CallbackProxy { /** Must function as described for the C-level sqlite3_update_hook() callback. diff --git a/ext/jni/src/org/sqlite/jni/package-info.java b/ext/jni/src/org/sqlite/jni/package-info.java index 21fdef27d7..853d76fd73 100644 --- a/ext/jni/src/org/sqlite/jni/package-info.java +++ b/ext/jni/src/org/sqlite/jni/package-info.java @@ -12,9 +12,10 @@ as cross-language semantics allow for. A closely-related goal is that the C documentation should be usable as-is, insofar as possible, - for most of the JNI binding. As a rule, undocumented symbols - behave as documented for their C API counterpart, and only - semantic differences are documented here. + for most of the JNI binding. As a rule, undocumented symbols in + the Java interface behave as documented for their C API + counterpart. Only semantic differences and Java-specific features + are documented here.

  • Support Java as far back as version 8 (2014).
  • diff --git a/manifest b/manifest index b92bb1d075..146b8b4def 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Expose\ssqlite3_stmt_explain(),\ssqlite3_stmt_isexplain(),\sand\ssqlite3_stmt_readonly()\sto\sJNI. -D 2023-09-01T06:50:17.074 +C JNI\sbuild\simprovements.\sRename\sa\sJava\sclass.\sGet\sthe\sjar\starget\sworking\sagain. +D 2023-09-01T09:43:56.871 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -234,19 +234,20 @@ F ext/fts5/tool/showfts5.tcl d54da0e067306663e2d5d523965ca487698e722c F ext/icu/README.txt 7ab7ced8ae78e3a645b57e78570ff589d4c672b71370f5aa9e1cd7024f400fc9 F ext/icu/icu.c c074519b46baa484bb5396c7e01e051034da8884bad1a1cb7f09bbe6be3f0282 F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a32075a8 -F ext/jni/GNUmakefile b6ae6d04cc33f2300ab7177bd5db1ecfbc8627f76fee6aec441f980e57594291 +F ext/jni/GNUmakefile c6100f8855f9f533466d75e031a458875003c5b5cc01fe9a34581d55f0048119 F ext/jni/README.md 1332b1fa27918bd5d9ca2d0d4f3ac3a6ab86b9e3699dc5bfe32904a027f3d2a9 F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa -F ext/jni/src/c/sqlite3-jni.c 6342a09eb10c46835b4b3ea84f1cfaeb9e7e720c0c15c7405fb18bfc62f9cc0f +F ext/jni/src/c/sqlite3-jni.c 94092d07a8a5df2cb66f4ac04a28d150ed29361a7aec82776bfdd3f1a3b947e8 F ext/jni/src/c/sqlite3-jni.h 3546b35d31fe3c13697edf3a3c35871941283de1d4f189154456ca61fd1282f6 F ext/jni/src/org/sqlite/jni/AbstractCollationCallback.java 95e88ba04f4aac51ffec65693e878e234088b2f21b387f4e4285c8b72b33e436 F ext/jni/src/org/sqlite/jni/AggregateFunction.java 7312486bc65fecdb91753c0a4515799194e031f45edbe16a6373cea18f404dc4 -F ext/jni/src/org/sqlite/jni/AuthorizerCallback.java d00a2409ab76cae168927e2ca6a7ffbd0621a42547cce88768b4eeebc13827e0 -F ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java 1470e14d09f10729d35568506c6e61318edfb17aa322802e386764fa6d582f14 -F ext/jni/src/org/sqlite/jni/BusyHandlerCallback.java cd12c26dafd3e6c097fc73f80d328aebac0f58b985f66a96ee567ddf8d195f30 -F ext/jni/src/org/sqlite/jni/CollationCallback.java 7d5b246f1a7c9d6b8e974d970bbbb2d05c6264e65448d7be6a85edbf703c823d -F ext/jni/src/org/sqlite/jni/CollationNeededCallback.java 1707b50146c6b805b79e84f89a57c8dbb0134e431799f041f0bec403eca5f841 -F ext/jni/src/org/sqlite/jni/CommitHookCallback.java e4de82c97560982e996e358958268e1e4e307b6115cd9aac0ff4f947d4380d90 +F ext/jni/src/org/sqlite/jni/AuthorizerCallback.java e6135be32f12bf140bffa39be7fd1a45ad83b2661ed49c08dbde04c8485feb38 +F ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java 5e4a75611c026730289d776469d6122cb2699d6970af5f53fe85e74d49930476 +F ext/jni/src/org/sqlite/jni/BusyHandlerCallback.java d316373b12b3bf1a421f1f7eed08128fa8dd52bb98617ba28c161aaabd71d1ee +F ext/jni/src/org/sqlite/jni/CallbackProxy.java 064a8a00e4c63cc501c30504f93ca996d422c5f010067f969b2d0a10f0868153 w ext/jni/src/org/sqlite/jni/SQLite3CallbackProxy.java +F ext/jni/src/org/sqlite/jni/CollationCallback.java df327348e1a34ee65210208d694d690e5ee0bfe901410122e07caf6c98b2b7c8 +F ext/jni/src/org/sqlite/jni/CollationNeededCallback.java 07df5fa161a0b81154295258037f662e7c372735c2899c76e81cb3abd9fd3b39 +F ext/jni/src/org/sqlite/jni/CommitHookCallback.java 77cf8bb4f5548113e9792978f3f8a454614f420fa0ad73939421cbff4e7776f2 F ext/jni/src/org/sqlite/jni/ConfigSqllogCallback.java e3656909eab7ed0f7e457c5b82df160ca22dd5e954c0a306ec1fca61b0d266b4 F ext/jni/src/org/sqlite/jni/Fts5.java 3ebfbd5b95fdb9d7bc40306f2e682abd12e247d9224e92510b8dd103b4f96fe8 F ext/jni/src/org/sqlite/jni/Fts5Context.java 0a5a02047a6a1dd3e4a38b0e542a8dd2de365033ba30e6ae019a676305959890 @@ -256,19 +257,18 @@ F ext/jni/src/org/sqlite/jni/Fts5PhraseIter.java 6642beda341c0b1b46af4e2d7f6f9ab F ext/jni/src/org/sqlite/jni/Fts5Tokenizer.java 91489893596b6528c0df5cd7180bd5b55809c26e2b797fb321dfcdbc1298c060 F ext/jni/src/org/sqlite/jni/NativePointerHolder.java 564087036449a16df148dcf0a067408bd251170bf23286c655f46b5f973e8b2d F ext/jni/src/org/sqlite/jni/OutputPointer.java 1f2319976fff206f5056eafc8a4f48d43abe09d5d1b5287ba9145a95d847cbb7 -F ext/jni/src/org/sqlite/jni/PreupdateHookCallback.java 500c968b3893edbddf67e8eb773852c3a8ae58097a77bd22320ada6b1af06db1 -F ext/jni/src/org/sqlite/jni/ProgressHandlerCallback.java 0da841810319f5a9dc372d0f2348930d54fac1a4b53e4298884f44c720d67830 +F ext/jni/src/org/sqlite/jni/PreupdateHookCallback.java eccaed8dc9c6289f07ef3fc109891c6be1e7cc6c88723d90174b68706fc21cda +F ext/jni/src/org/sqlite/jni/ProgressHandlerCallback.java 7b9ff2218129ece98ba60c57eeedcd8447e9e3b6e5d0f5e5d3eb0f0c5037d48d F ext/jni/src/org/sqlite/jni/ResultCode.java ba701f20213a5f259e94cfbfdd36eb7ac7ce7797f2c6c7fca2004ff12ce20f86 -F ext/jni/src/org/sqlite/jni/RollbackHookCallback.java 16042be9d072a26dbb2f1b1b63e7639989b747bb80d2bd667ba4f7555f56a825 +F ext/jni/src/org/sqlite/jni/RollbackHookCallback.java d12352c0e22840de484ffa9b11ed5058bb0daca2e9f218055d3c54c947a273c4 F ext/jni/src/org/sqlite/jni/SQLFunction.java 544a875d33fd160467d82e2397ac33157b29971d715a821a4fad3c899113ee8c -F ext/jni/src/org/sqlite/jni/SQLite3CallbackProxy.java c2748ab52856075b053a55b317988d95dc7fb4d3d42520f8c33573effe1cd185 F ext/jni/src/org/sqlite/jni/SQLite3Jni.java af43be2c0795e22ca489d9237697cf743a9338860ba937ea689cd1810bf737ee F ext/jni/src/org/sqlite/jni/ScalarFunction.java 6d387bb499fbe3bc13c53315335233dbf6a0c711e8fa7c521683219b041c614c F ext/jni/src/org/sqlite/jni/TableColumnMetadata.java 54511b4297fa28dcb3f49b24035e34ced10e3fd44fd0e458e784f4d6b0096dab -F ext/jni/src/org/sqlite/jni/Tester1.java 891255bbaac87893fafe3b0109f6dbc9329c2accfd5b5c7a0b2bd9d874810ede +F ext/jni/src/org/sqlite/jni/Tester1.java 3de9259606b40576e8a87dd28b228bbd077cccb518afec101246a14acd258c5f F ext/jni/src/org/sqlite/jni/TesterFts5.java 6f135c60e24c89e8eecb9fe61dde0f3bb2906de668ca6c9186bcf34bdaf94629 -F ext/jni/src/org/sqlite/jni/TraceV2Callback.java 641926b05a772c2c05c842a81aa839053ba4a13b78ef04b402f5705d060c6246 -F ext/jni/src/org/sqlite/jni/UpdateHookCallback.java be2bc96ff4f56b3c1fd18ae7dba9b207b25b6c123b8a5fd2f7aaf3cc208d8b7d +F ext/jni/src/org/sqlite/jni/TraceV2Callback.java beb0b064c1a5f8bfe585a324ed39a4e33edbe379a3fc60f1401661620d3ca7c0 +F ext/jni/src/org/sqlite/jni/UpdateHookCallback.java 8376f4a931f2d5612b295c003c9515ba933ee76d8f95610e89c339727376e36c F ext/jni/src/org/sqlite/jni/ValueHolder.java f022873abaabf64f3dd71ab0d6037c6e71cece3b8819fa10bf26a5461dc973ee F ext/jni/src/org/sqlite/jni/WindowFunction.java 488980f4dbb6bdd7067d6cb9c43e4075475e51c54d9b74a5834422654b126246 F ext/jni/src/org/sqlite/jni/XDestroyCallback.java 50c5ca124ef6c6b735a7e136e7a23a557be367e61b56d4aab5777a614ab46cc2 @@ -279,7 +279,7 @@ F ext/jni/src/org/sqlite/jni/annotation/package-info.java f66bfb621c6494e67c03ed F ext/jni/src/org/sqlite/jni/fts5_api.java ee47f1837d32968f7bb62278c7504c0fb572a68ec107371b714578312e9f734b F ext/jni/src/org/sqlite/jni/fts5_extension_function.java ac825035d7d83fc7fd960347abfa6803e1614334a21533302041823ad5fc894c F ext/jni/src/org/sqlite/jni/fts5_tokenizer.java a92c2e55bda492e4c76d48ddc73369bcc0d5e8727940840f9339e3292ea58fa7 -F ext/jni/src/org/sqlite/jni/package-info.java 016cda6582ffb7af976455360f0730bf075a0ef4ef9d561f7646790c951e1504 +F ext/jni/src/org/sqlite/jni/package-info.java a3946db2504de747a1993c4f6e8ce604bec5a8e5a134b292c3b07527bc321a99 F ext/jni/src/org/sqlite/jni/sqlite3.java 62b1b81935ccf3393472d17cb883dc5ff39c388ec3bc1de547f098a0217158fc F ext/jni/src/org/sqlite/jni/sqlite3_context.java 66ca95ce904044263a4aff684abe262d56f73e6b06bca6cf650761d79d7779ad F ext/jni/src/org/sqlite/jni/sqlite3_stmt.java 78e6d1b95ac600a9475e9db4623f69449322b0c93d1bd4e1616e76ed547ed9fc @@ -2116,8 +2116,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d732f71d0a292dbb493f79f7c6ecd8a4effbfbc91453b1c54bdd9becf2d75bdb -R d6cbdc791e6b94495eeb2607a5aa6bb1 +P 208b786afe16eafaf0ce791f319a5e05f733a7b71ce1c542e1b83481b013ec38 +R 2b0398aeaa0204ef877d7a162bfccfd2 U stephan -Z d7105d8e3faee08846ef7fd47243b17f +Z 4d9595c68497abda167c9e1929e109f6 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index e873e09de2..3679ee2ff0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -208b786afe16eafaf0ce791f319a5e05f733a7b71ce1c542e1b83481b013ec38 \ No newline at end of file +d086b7844cace5c997261c97565aeef62aaeeef727ccc7e83f17c54d6217b779 \ No newline at end of file