[kaffe] CVS kaffe (robilad): Added jni weak ref tests

Kaffe CVS cvs-commits at kaffe.org
Tue Jul 12 16:55:28 PDT 2005


PatchSet 6725 
Date: 2005/07/12 23:50:48
Author: robilad
Branch: HEAD
Tag: (none) 
Log:
Added jni weak ref tests

2005-07-13  Dalibor Topic  <robilad at kaffe.org>

        * test/jni/Makefile.am: (check_PROGRAMS) Added jniWeakTest.
        (check_LTLIBRARIES, libjniweaklib_la_SOURCES, libjniweaklib_la_LDFLAGS,
        JAVA_CLASSES, CPATH, JNIWeakTest.class, jniWeakTest_SOURCES,
        jniWeakTest_LDADD, jniWeakTest_DEPENDECIES, jniWeakTest.o): New rules.
        (TESTS_ENVIRONMENT) Set BOOTCLASSPATH and KAFFELIBRARYPATH.
        (EXTRA_DIST) Added JNIWeakTest.java.

        * test/jni/Makefile.in: Regenerated.

2005-07-13  Guilhem Lavaux  <guilhem at kaffe.org>

        * test/jni/JNIWeakTest.java,
        test/jni/jniWeakTest.c,
        test/jni/jniweaklib.c: New test.

Members: 
	ChangeLog:1.4249->1.4250 
	test/jni/JNIWeakTest.java:INITIAL->1.1 
	test/jni/Makefile.am:1.7->1.8 
	test/jni/Makefile.in:1.37->1.38 
	test/jni/jniWeakTest.c:INITIAL->1.1 
	test/jni/jniweaklib.c:INITIAL->1.1 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.4249 kaffe/ChangeLog:1.4250
--- kaffe/ChangeLog:1.4249	Tue Jul 12 13:35:38 2005
+++ kaffe/ChangeLog	Tue Jul 12 23:50:48 2005
@@ -1,3 +1,20 @@
+2005-07-13  Dalibor Topic  <robilad at kaffe.org>
+
+	* test/jni/Makefile.am: (check_PROGRAMS) Added jniWeakTest.
+	(check_LTLIBRARIES, libjniweaklib_la_SOURCES, libjniweaklib_la_LDFLAGS,
+	JAVA_CLASSES, CPATH, JNIWeakTest.class, jniWeakTest_SOURCES, 
+	jniWeakTest_LDADD, jniWeakTest_DEPENDECIES, jniWeakTest.o): New rules.
+	(TESTS_ENVIRONMENT) Set BOOTCLASSPATH and KAFFELIBRARYPATH.
+	(EXTRA_DIST) Added JNIWeakTest.java.
+
+	* test/jni/Makefile.in: Regenerated.
+
+2005-07-13  Guilhem Lavaux  <guilhem at kaffe.org>
+
+	* test/jni/JNIWeakTest.java,
+	test/jni/jniWeakTest.c,
+	test/jni/jniweaklib.c: New test.
+
 2005-07-12  Dalibor Topic  <robilad at kaffe.org>
 
 	Resynced with GNU classpath.
===================================================================
Checking out kaffe/test/jni/JNIWeakTest.java
RCS:  /home/cvs/kaffe/kaffe/test/jni/JNIWeakTest.java,v
VERS: 1.1
***************
--- /dev/null	Sun Aug  4 19:57:58 2002
+++ kaffe/test/jni/JNIWeakTest.java	Tue Jul 12 23:55:28 2005
@@ -0,0 +1,23 @@
+public class JNIWeakTest
+{
+	static {
+		System.out.println("Loading jniweaklib...");
+		System.loadLibrary("jniweaklib");
+	}
+
+	native Object testWeak();
+
+	static public void main(String args[])
+	{
+		JNIWeakTest o = new JNIWeakTest();
+		Object o2;
+
+		o2 = o.testWeak();
+
+		if (o2 == o)
+			System.out.println("OK !");
+		else
+			System.out.println("FAIL !");
+	}
+}
+
Index: kaffe/test/jni/Makefile.am
diff -u kaffe/test/jni/Makefile.am:1.7 kaffe/test/jni/Makefile.am:1.8
--- kaffe/test/jni/Makefile.am:1.7	Sun Apr 10 17:26:31 2005
+++ kaffe/test/jni/Makefile.am	Tue Jul 12 23:50:52 2005
@@ -6,7 +6,7 @@
 # See the file "license.terms" for information on usage and redistribution
 # of this file.
 
-check_PROGRAMS= jniBase jniExecClass jniReflect
+check_PROGRAMS= jniBase jniExecClass jniReflect jniWeakTest
 
 AM_CPPFLAGS= \
 	-I$(top_builddir)/include \
@@ -57,9 +57,64 @@
 	@LIBLTDL@
 jniReflect_DEPENDENCIES= $(LIBKAFFEVM)
 
-EXTRA_DIST = HelloWorldApp.class
+# Okay, the following is a bit convulted and hackish, and makes me feel dizzy.
+# But as I found no way to do it better, here it goes:
+#
+# We need to have a JNI library built just for make check purpose, i.e
+# a) it may not be installed
+# b) it may only build on check
+# c) in must be dlopen-able for JNI library loading to work
+# d) it must actually load the library and run it
+# 
+# Solution for a and b: Fortunately, automake lets us build libtool libraries for 
+# make check purpose only using check_LTLIBRARIES.
+# Solution for c: Unfortunately, it builds convenience libraries by default, which
+# can not be dlopened. Adding -module or -static to LDFLAGS does not help, one 
+# needs to add -rpath with a fake absolute directory to it to make libtool build
+# a dlopenable library.
+# Solution for d: Adding . to KAFFELIBRARYPATH allows the resulting test to find the
+# so created library.
+# 
+# Amazingly enough, this actually seems to work.
+
+check_LTLIBRARIES = libjniweaklib.la
+
+libjniweaklib_la_SOURCES = jniweaklib.c
+
+libjniweaklib_la_LDFLAGS = \
+	$(KLIBFLAGS) \
+	-no-undefined \
+	-module \
+	-rpath $(nativedir) \
+	-release $(PACKAGE_VERSION)
+
+JAVA_CLASSES = \
+	JNIWeakTest.class
+
+CPATH = .:$(top_builddir)/libraries/javalib/rt.jar
 
-TESTS_ENVIRONMENT = env `. $(top_builddir)/BUILD_ENVIRONMENT; sed 's/.*export \(.*\)/echo \1=$$\1/' < $(top_builddir)/BUILD_ENVIRONMENT | sh`
+JNIWeakTest.class:  $(srcdir)/JNIWeakTest.java
+	$(JIKES) -g -classpath $(CPATH) -d . $(srcdir)/JNIWeakTest.java
+
+jniWeakTest_SOURCES = jniWeakTest.c
+
+jniWeakTest_LDADD= \
+	-dlopen $(top_builddir)/test/jni/libjniweaklib.la \
+	$(DLOPEN_JAVA_LIBS) \
+	$(LIBKAFFEVM) \
+	$(LIBREPLACE) \
+        $(LTLIBINTL) \
+	@LIBLTDL@
+
+jniWeakTest_DEPENDECIES = $(LIBKAFFEVM) libjniweaklib.la
+
+jniWeakTest.o: JNIWeakTest.class
+
+EXTRA_DIST = \
+	JNIWeakTest.java \
+	HelloWorldApp.class
+
+TESTS_ENVIRONMENT = env `BOOTCLASSPATH="."; export BOOTCLASSPATH; KAFFELIBRARYPATH="." ; export KAFFELIBRARYPATH ; .  $(top_builddir)/BUILD_ENVIRONMENT; sed  's/.*export \(.*\)/echo \1=$$\1/' < $(top_builddir)/BUILD_ENVIRONMENT | sh`
 TESTS = $(check_PROGRAMS)
 
 CLEANFILES = *.fail *.out core *.core
Index: kaffe/test/jni/Makefile.in
diff -u kaffe/test/jni/Makefile.in:1.37 kaffe/test/jni/Makefile.in:1.38
--- kaffe/test/jni/Makefile.in:1.37	Sat May 14 21:47:09 2005
+++ kaffe/test/jni/Makefile.in	Tue Jul 12 23:50:52 2005
@@ -21,7 +21,7 @@
 #
 # See the file "license.terms" for information on usage and redistribution
 # of this file.
-SOURCES = $(jniBase_SOURCES) $(jniExecClass_SOURCES) $(jniReflect_SOURCES)
+SOURCES = $(libjniweaklib_la_SOURCES) $(jniBase_SOURCES) $(jniExecClass_SOURCES) $(jniReflect_SOURCES) $(jniWeakTest_SOURCES)
 
 srcdir = @srcdir@
 top_srcdir = @top_srcdir@
@@ -46,7 +46,7 @@
 build_triplet = @build@
 host_triplet = @host@
 check_PROGRAMS = jniBase$(EXEEXT) jniExecClass$(EXEEXT) \
-	jniReflect$(EXEEXT)
+	jniReflect$(EXEEXT) jniWeakTest$(EXEEXT)
 subdir = test/jni
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -76,6 +76,9 @@
 mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
 CONFIG_HEADER = $(top_builddir)/config/config.h
 CONFIG_CLEAN_FILES =
+libjniweaklib_la_LIBADD =
+am_libjniweaklib_la_OBJECTS = jniweaklib.lo
+libjniweaklib_la_OBJECTS = $(am_libjniweaklib_la_OBJECTS)
 am_jniBase_OBJECTS = jniBase.$(OBJEXT)
 jniBase_OBJECTS = $(am_jniBase_OBJECTS)
 am__DEPENDENCIES_1 =
@@ -90,6 +93,11 @@
 jniExecClass_OBJECTS = $(am_jniExecClass_OBJECTS)
 am_jniReflect_OBJECTS = jniReflect.$(OBJEXT)
 jniReflect_OBJECTS = $(am_jniReflect_OBJECTS)
+am_jniWeakTest_OBJECTS = jniWeakTest.$(OBJEXT)
+jniWeakTest_OBJECTS = $(am_jniWeakTest_OBJECTS)
+jniWeakTest_DEPENDENCIES = $(top_builddir)/test/jni/libjniweaklib.la \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_4) \
+	$(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1)
 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/config
 depcomp = $(SHELL) $(top_srcdir)/scripts/depcomp
 am__depfiles_maybe = depfiles
@@ -100,10 +108,12 @@
 	$(AM_CFLAGS) $(CFLAGS)
 LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
 	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-SOURCES = $(jniBase_SOURCES) $(jniExecClass_SOURCES) \
-	$(jniReflect_SOURCES)
-DIST_SOURCES = $(jniBase_SOURCES) $(jniExecClass_SOURCES) \
-	$(jniReflect_SOURCES)
+SOURCES = $(libjniweaklib_la_SOURCES) $(jniBase_SOURCES) \
+	$(jniExecClass_SOURCES) $(jniReflect_SOURCES) \
+	$(jniWeakTest_SOURCES)
+DIST_SOURCES = $(libjniweaklib_la_SOURCES) $(jniBase_SOURCES) \
+	$(jniExecClass_SOURCES) $(jniReflect_SOURCES) \
+	$(jniWeakTest_SOURCES)
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -423,8 +433,54 @@
 	@LIBLTDL@
 
 jniReflect_DEPENDENCIES = $(LIBKAFFEVM)
-EXTRA_DIST = HelloWorldApp.class
-TESTS_ENVIRONMENT = env `. $(top_builddir)/BUILD_ENVIRONMENT; sed 's/.*export \(.*\)/echo \1=$$\1/' < $(top_builddir)/BUILD_ENVIRONMENT | sh`
+
+# Okay, the following is a bit convulted and hackish, and makes me feel dizzy.
+# But as I found no way to do it better, here it goes:
+#
+# We need to have a JNI library built just for make check purpose, i.e
+# a) it may not be installed
+# b) it may only build on check
+# c) in must be dlopen-able for JNI library loading to work
+# d) it must actually load the library and run it
+# 
+# Solution for a and b: Fortunately, automake lets us build libtool libraries for 
+# make check purpose only using check_LTLIBRARIES.
+# Solution for c: Unfortunately, it builds convenience libraries by default, which
+# can not be dlopened. Adding -module or -static to LDFLAGS does not help, one 
+# needs to add -rpath with a fake absolute directory to it to make libtool build
+# a dlopenable library.
+# Solution for d: Adding . to KAFFELIBRARYPATH allows the resulting test to find the
+# so created library.
+# 
+# Amazingly enough, this actually seems to work.
+check_LTLIBRARIES = libjniweaklib.la
+libjniweaklib_la_SOURCES = jniweaklib.c
+libjniweaklib_la_LDFLAGS = \
+	$(KLIBFLAGS) \
+	-no-undefined \
+	-module \
+	-rpath $(nativedir) \
+	-release $(PACKAGE_VERSION)
+
+JAVA_CLASSES = \
+	JNIWeakTest.class
+
+CPATH = .:$(top_builddir)/libraries/javalib/rt.jar
+jniWeakTest_SOURCES = jniWeakTest.c
+jniWeakTest_LDADD = \
+	-dlopen $(top_builddir)/test/jni/libjniweaklib.la \
+	$(DLOPEN_JAVA_LIBS) \
+	$(LIBKAFFEVM) \
+	$(LIBREPLACE) \
+        $(LTLIBINTL) \
+	@LIBLTDL@
+
+jniWeakTest_DEPENDECIES = $(LIBKAFFEVM) libjniweaklib.la
+EXTRA_DIST = \
+	JNIWeakTest.java \
+	HelloWorldApp.class
+
+TESTS_ENVIRONMENT = env `BOOTCLASSPATH="."; export BOOTCLASSPATH; KAFFELIBRARYPATH="." ; export KAFFELIBRARYPATH ; .  $(top_builddir)/BUILD_ENVIRONMENT; sed  's/.*export \(.*\)/echo \1=$$\1/' < $(top_builddir)/BUILD_ENVIRONMENT | sh`
 TESTS = $(check_PROGRAMS)
 CLEANFILES = *.fail *.out core *.core
 all: all-am
@@ -461,6 +517,17 @@
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 
+clean-checkLTLIBRARIES:
+	-test -z "$(check_LTLIBRARIES)" || rm -f $(check_LTLIBRARIES)
+	@list='$(check_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+libjniweaklib.la: $(libjniweaklib_la_OBJECTS) $(libjniweaklib_la_DEPENDENCIES) 
+	$(LINK)  $(libjniweaklib_la_LDFLAGS) $(libjniweaklib_la_OBJECTS) $(libjniweaklib_la_LIBADD) $(LIBS)
+
 clean-checkPROGRAMS:
 	@list='$(check_PROGRAMS)'; for p in $$list; do \
 	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
@@ -476,6 +543,9 @@
 jniReflect$(EXEEXT): $(jniReflect_OBJECTS) $(jniReflect_DEPENDENCIES) 
 	@rm -f jniReflect$(EXEEXT)
 	$(LINK) $(jniReflect_LDFLAGS) $(jniReflect_OBJECTS) $(jniReflect_LDADD) $(LIBS)
+jniWeakTest$(EXEEXT): $(jniWeakTest_OBJECTS) $(jniWeakTest_DEPENDENCIES) 
+	@rm -f jniWeakTest$(EXEEXT)
+	$(LINK) $(jniWeakTest_LDFLAGS) $(jniWeakTest_OBJECTS) $(jniWeakTest_LDADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -486,6 +556,8 @@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/jniBase.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/jniExecClass.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/jniReflect.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/jniWeakTest.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/jniweaklib.Plo at am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
@@ -667,7 +739,7 @@
 	  fi; \
 	done
 check-am: all-am
-	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) $(check_LTLIBRARIES) $(check_PROGRAMS)
 	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
 check: check-am
 all-am: Makefile
@@ -699,8 +771,8 @@
 	@echo "it deletes files that may require special tools to rebuild."
 clean: clean-am
 
-clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
-	mostlyclean-am
+clean-am: clean-checkLTLIBRARIES clean-checkPROGRAMS clean-generic \
+	clean-libtool mostlyclean-am
 
 distclean: distclean-am
 	-rm -rf ./$(DEPDIR)
@@ -749,17 +821,22 @@
 uninstall-am: uninstall-info-am
 
 .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
-	clean-checkPROGRAMS clean-generic clean-libtool ctags \
-	distclean distclean-compile distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-exec install-exec-am install-info \
-	install-info-am install-man install-strip installcheck \
-	installcheck-am installdirs maintainer-clean \
+	clean-checkLTLIBRARIES clean-checkPROGRAMS clean-generic \
+	clean-libtool ctags distclean distclean-compile \
+	distclean-generic distclean-libtool distclean-tags distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-exec install-exec-am \
+	install-info install-info-am install-man install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
 	maintainer-clean-generic mostlyclean mostlyclean-compile \
 	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
 	tags uninstall uninstall-am uninstall-info-am
 
+
+JNIWeakTest.class:  $(srcdir)/JNIWeakTest.java
+	$(JIKES) -g -classpath $(CPATH) -d . $(srcdir)/JNIWeakTest.java
+
+jniWeakTest.o: JNIWeakTest.class
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
===================================================================
Checking out kaffe/test/jni/jniWeakTest.c
RCS:  /home/cvs/kaffe/kaffe/test/jni/jniWeakTest.c,v
VERS: 1.1
***************
--- /dev/null	Sun Aug  4 19:57:58 2002
+++ kaffe/test/jni/jniWeakTest.c	Tue Jul 12 23:55:28 2005
@@ -0,0 +1,98 @@
+/*
+ * jniTestWeak.c
+ *
+ * Copyright (c) 2005
+ *    The Kaffe.org's developers. See ChangeLog for details.
+ *
+ * See the file "license.terms" for information on usage and redistribution
+ * of this file.
+ */
+#include <jni.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <ltdl.h>
+
+static char *concatString(const char *s1, const char *s2)
+{
+	char *s;
+
+	if (s1 == NULL)
+		s1 = "";
+	if (s2 == NULL)
+		s2 = "";
+	s = (char *) malloc(strlen(s1) + strlen(s2) + 1);
+	return strcat(strcpy(s, s1), s2);
+}
+
+int main(void)
+{
+  JavaVMInitArgs vmargs;
+  JavaVM *vm;
+  JNIEnv *env;
+  JavaVMOption myoptions[3];
+  jclass cls, scls;
+  jarray args;
+  jmethodID mainid;
+
+  /* set up libtool/libltdl dlopen emulation */
+  myoptions[0].optionString = concatString("-Xbootclasspath:", getenv("BOOTCLASSPATH"));
+  myoptions[1].optionString = concatString("-Xclasspath:", CLASSPATH_SOURCE_DIR);  
+  myoptions[2].optionString = "-Xvmdebug:NATIVELIB";  
+
+  vmargs.version = JNI_VERSION_1_2;
+  if (JNI_GetDefaultJavaVMInitArgs (&vmargs) < 0)
+    {
+      fprintf(stderr, " Cannot retrieve default arguments\n");
+      return 1;
+    }
+
+  vmargs.nOptions = 2;
+  vmargs.options = myoptions;
+
+  if (JNI_CreateJavaVM (&vm, (void **)&env, &vmargs) < 0)
+    {
+      fprintf(stderr, " Cannot create the Java VM\n");
+      return 1;
+    }
+  
+  cls = (*env)->FindClass(env, "JNIWeakTest");
+  if ((*env)->ExceptionOccurred(env))
+    {
+	    (*env)->ExceptionDescribe(env);
+      fprintf(stderr, "FindClass has failed\n");
+      return 1;
+    }
+
+  mainid = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V");
+  if ((*env)->ExceptionOccurred(env))
+    {
+      fprintf(stderr, "GetStaticMethodID has failed\n");
+      return 1;
+    }
+
+  scls = (*env)->FindClass(env, "java/lang/String");
+  if ((*env)->ExceptionOccurred(env))
+    {
+      fprintf(stderr, "FindClass(java/lang/String) has failed\n");
+      return 1;
+    }
+
+  args = (*env)->NewObjectArray(env, 0, scls, 0);
+  if ((*env)->ExceptionOccurred(env))
+    {
+      fprintf(stderr, "NewObjectArray has failed\n");
+      return 1;
+    }
+
+  (*env)->CallStaticVoidMethod(env, cls, mainid, args);
+  if ((*env)->ExceptionOccurred(env))
+    {
+      fprintf(stderr, "CallStaticMethod has failed\n");
+      return 1;
+    }
+
+  (*vm)->DestroyJavaVM(vm);
+
+  return 0;
+}
===================================================================
Checking out kaffe/test/jni/jniweaklib.c
RCS:  /home/cvs/kaffe/kaffe/test/jni/jniweaklib.c,v
VERS: 1.1
***************
--- /dev/null	Sun Aug  4 19:57:58 2002
+++ kaffe/test/jni/jniweaklib.c	Tue Jul 12 23:55:28 2005
@@ -0,0 +1,7 @@
+#include <jni.h>
+
+JNIEXPORT jobject JNICALL
+Java_JNIWeakTest_testWeak(JNIEnv *env, jobject obj)
+{
+	return (*env)->NewWeakGlobalRef(env, obj);
+}	



More information about the kaffe mailing list