]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
JNI build improvements. Rename a Java class. Get the jar target working again.
authorstephan <stephan@noemail.net>
Fri, 1 Sep 2023 09:43:56 +0000 (09:43 +0000)
committerstephan <stephan@noemail.net>
Fri, 1 Sep 2023 09:43:56 +0000 (09:43 +0000)
FossilOrigin-Name: d086b7844cace5c997261c97565aeef62aaeeef727ccc7e83f17c54d6217b779

18 files changed:
ext/jni/GNUmakefile
ext/jni/src/c/sqlite3-jni.c
ext/jni/src/org/sqlite/jni/AuthorizerCallback.java
ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java
ext/jni/src/org/sqlite/jni/BusyHandlerCallback.java
ext/jni/src/org/sqlite/jni/CallbackProxy.java [moved from ext/jni/src/org/sqlite/jni/SQLite3CallbackProxy.java with 97% similarity]
ext/jni/src/org/sqlite/jni/CollationCallback.java
ext/jni/src/org/sqlite/jni/CollationNeededCallback.java
ext/jni/src/org/sqlite/jni/CommitHookCallback.java
ext/jni/src/org/sqlite/jni/PreupdateHookCallback.java
ext/jni/src/org/sqlite/jni/ProgressHandlerCallback.java
ext/jni/src/org/sqlite/jni/RollbackHookCallback.java
ext/jni/src/org/sqlite/jni/Tester1.java
ext/jni/src/org/sqlite/jni/TraceV2Callback.java
ext/jni/src/org/sqlite/jni/UpdateHookCallback.java
ext/jni/src/org/sqlite/jni/package-info.java
manifest
manifest.uuid

index fe53f36a03092a151518de99f3b8867794bc3dcf..02998569a2f4844535da6452430301be8614f511 100644 (file)
@@ -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
index bc15212251c27dda9a01f63cd125b093ff0af4b3..8e654a1b283cdff098109d0db5890912806fcd1d 100644 (file)
@@ -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);
       }
index a9f15fc6c2f127ff301f75e39e12d63769c71e2d..6dbd9cb77b5887b34bd47b96919de9190be06b70 100644 (file)
@@ -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.
index 1f8ace2fb838bb867225d7567829de5e53cdfe21..4a36941306f612d69bd5afcda4585c6600e572e1 100644 (file)
@@ -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.
index db9295bb61071cbd574e3a153660aa438b6a2559..30a5edc037066b468d8caddc0906a23c90306879 100644 (file)
@@ -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*)
similarity index 97%
rename from ext/jni/src/org/sqlite/jni/SQLite3CallbackProxy.java
rename to ext/jni/src/org/sqlite/jni/CallbackProxy.java
index 50526649373781bd8ee20a29b783f1bd7061a45c..086c2f8e5d34b4bba97a25be6ed5849f851da403 100644 (file)
@@ -41,4 +41,4 @@ package org.sqlite.jni;
    <p>2) They all have a {@code call()} method but its signature is
    callback-specific.
 */
-public interface SQLite3CallbackProxy {}
+public interface CallbackProxy {}
index 481c6cd956174732c09d40832a776fd67dde65df..7f0e79a3fa27cfedd6fbc0871d9884589450b8e1 100644 (file)
@@ -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.
index e6c917a2c2c95ab70f7b626fcba34056fc34e9ad..b72cf1ba533dfd7645eb5ea2cdaea330740e7922 100644 (file)
@@ -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.
index 253d0b8cfa5ba01535eaf1cb20e5cf5e9b8e02f6..2e9a68d25dbbede01c39d20ec4c354ef4997b10d 100644 (file)
@@ -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.
index b68dd4b6d41e52eaba40e4172d64c5501a87e8c8..a60613932873ae94d9f710fdc725206f5517e1ac 100644 (file)
@@ -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.
index d15bf31a11207a20fb551635c1086457d8f783e4..bc15377037030c6beaf58dd399f08a4a88ad24d7 100644 (file)
@@ -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.
 
index 3bf9f79a1ae86bbf37e89e2c133278132561a859..21600c80579b08fb56529c0809629065baab05c5 100644 (file)
@@ -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.
index 4bd7e42ed64b0ea78c65a7acbdbc35a1559a41a9..f47b5944a47d03efb78ceb7657489996beb83570 100644 (file)
@@ -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<Future<?>> 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_")){
index 897aeefa9ff01df92fa4b136f2c848bca96d9f4c..4e69bd87560dc89bc032a73b1dec0e062646925a 100644 (file)
@@ -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
index 4fd0a63240cd603e86a3c31c11759394a1eb2610..4d6afb887fd94b00d80d2893f3d3394a94ae6ef1 100644 (file)
@@ -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.
index 21fdef27d7532623e1b73c5acb514c121116c3f5..853d76fd73861e3bafd4a40fea2303b863d990d4 100644 (file)
      as cross-language semantics allow for. A closely-related goal is
      that <a href='https://sqlite.org/c3ref/intro.html'>the C
      documentation</a> 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.</li>
+     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.</li>
 
      <li>Support Java as far back as version 8 (2014).</li>
 
index b92bb1d075062e0bea482b5498bed5f379774af8..146b8b4deffa546f17a553feea049cabff250209 100644 (file)
--- 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.
index e873e09de247c74fb47e3f25d073811b70808633..3679ee2ff050101188cda510946b74c27ee26a38 100644 (file)
@@ -1 +1 @@
-208b786afe16eafaf0ce791f319a5e05f733a7b71ce1c542e1b83481b013ec38
\ No newline at end of file
+d086b7844cace5c997261c97565aeef62aaeeef727ccc7e83f17c54d6217b779
\ No newline at end of file