Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
8cf243a
moved tests to subpkg jpype.test (1)
marscher Apr 5, 2025
a733880
fix package names in java files
marscher Apr 5, 2025
713ed2b
f array
marscher Apr 5, 2025
c90f7e3
f reflect
marscher Apr 5, 2025
fe1ae88
f zzz
marscher Apr 5, 2025
0fa1fad
f virt
marscher Apr 5, 2025
2aab970
f functional
marscher Apr 5, 2025
d0b353a
f ref
marscher Apr 5, 2025
208a490
f proxy
marscher Apr 5, 2025
15cd159
f directbuff
marscher Apr 5, 2025
81f9d29
f legacy
marscher Apr 5, 2025
0d6f7aa
f attr
marscher Apr 5, 2025
d15eeef
f exc
marscher Apr 5, 2025
56734f0
f forname
marscher Apr 5, 2025
8199a29
f char
marscher Apr 5, 2025
b689c92
f primitives
marscher Apr 5, 2025
63f4342
f stuff
marscher Apr 5, 2025
a7e0891
f stuff
marscher Apr 5, 2025
6b4a38d
f stuff
marscher Apr 5, 2025
bbd6ee7
f imports
marscher Apr 5, 2025
b710142
f javacoverage
marscher Apr 5, 2025
30ff565
f files
marscher Apr 5, 2025
201c6e8
[refactor out] Since we are relying on pytest for a long time now. We…
marscher Apr 5, 2025
bbfa677
f javadoc
marscher Apr 5, 2025
3158ab8
f classhints
marscher Apr 5, 2025
ba5d336
f imports
marscher Apr 5, 2025
34b1e17
f customizer
marscher Apr 5, 2025
00dd676
f collection
marscher Apr 5, 2025
e8c8f19
f fff
marscher Apr 5, 2025
6884dbd
f boxed
marscher Apr 5, 2025
104ee33
f caller sensitive
marscher Apr 5, 2025
d7eef44
[refactor] made start_test_jvm a global function
marscher Apr 5, 2025
837cbde
fix subrun
marscher Apr 5, 2025
4803645
fix properties
marscher Apr 5, 2025
fb02829
fix conversion
marscher Apr 5, 2025
e47a49d
fix varargs
marscher Apr 5, 2025
e2e6178
fix numeric, objwrapper
marscher Apr 5, 2025
cb34f24
fix legacy
marscher Apr 5, 2025
e064dbc
fix utf8
marscher Apr 5, 2025
4fc50c5
minor
marscher Apr 5, 2025
ae3abab
f overloads
marscher Apr 5, 2025
1c43f94
f serial
marscher Apr 5, 2025
a737464
store custom options for later access
marscher Apr 5, 2025
083c68b
f coverage
marscher Apr 5, 2025
a4e9ff3
f proxy multithreaded
marscher Apr 5, 2025
fe05d92
cleanup
marscher Apr 5, 2025
4ce1a22
f startup (wip)
marscher Apr 5, 2025
aa4ef97
merged master (squashed)
marscher Apr 5, 2025
d468557
fix path
marscher Apr 5, 2025
4959f85
[pyproject.toml] fix license value (table is deprecated in setuptools)
marscher Apr 5, 2025
998e5dc
fix mypy issue
marscher Apr 6, 2025
06670a4
fix startup
marscher Apr 6, 2025
5f16998
cleanup
marscher Apr 6, 2025
fbd0dce
finally moved all harness classes to "org.jpype.test" Java package.
marscher Apr 6, 2025
aa6b6e0
fix
marscher Apr 6, 2025
812f95d
use Ant to build testing jars (wip)
marscher Apr 6, 2025
d5a7478
use Ant to build testing jars (wip)
marscher Apr 6, 2025
12d6ac2
[pyproject.toml] fix license
marscher Apr 16, 2025
3332693
replaced self.assertTrue with assert
marscher Apr 16, 2025
2c7d41a
fix path
marscher Apr 16, 2025
37480cb
minor
marscher Apr 16, 2025
80072bc
Merge branch 'master' into testing_updates
marscher Jul 7, 2025
95d3fc1
Merge branch 'master' into testing_updates
marscher Sep 26, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 9 additions & 6 deletions jpype/_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -334,7 +334,7 @@ def startJVM(
# Don't remove

# ok, setup the jpype system classloader and add to the path after startup
# this guarentees all classes have the same permissions as they did in the past
# this guarantees all classes have the same permissions as they did in the past
from urllib.parse import quote
extra_jvm_args += [
'-Djava.system.class.loader=org.jpype.JPypeClassLoader',
Expand Down Expand Up @@ -563,17 +563,17 @@ def synchronized(obj):
return _jpype._JMonitor(obj)


def getJVMVersion():
def getJVMVersion() -> tuple[int, int, int] | tuple[int, ...]:
""" Get the JVM version if the JVM is started.

This function can be used to determine the version of the JVM. It is
useful to help determine why a Jar has failed to load.

Returns:
A typle with the (major, minor, revison) of the JVM if running.
A tuple with the (major, minor, revision) of the JVM if running.
"""
if not _jpype.isStarted():
return (0, 0, 0)
return 0, 0, 0

import re
runtime = _jpype.JClass('java.lang.Runtime')
Expand All @@ -582,8 +582,11 @@ def getJVMVersion():
# Java 9+ has a version method
if not version:
version = runtime.version()
version = (re.match("([0-9.]+)", str(version)).group(1))
return tuple([int(i) for i in version.split('.')])
match = re.match("([0-9.]+)", str(version))
if not match:
raise RuntimeError("could not determine JVM version")
version = match.group(1)
return tuple(int(i) for i in version.split('.'))


@_jcustomizer.JImplementationFor("java.lang.Runtime")
Expand Down
19 changes: 16 additions & 3 deletions native/jpype_module/src/main/java/org/jpype/JPypeSignal.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
**************************************************************************** */
package org.jpype;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
Expand Down Expand Up @@ -51,10 +52,22 @@ static void installHandlers()
Class SignalHandler = Class.forName("sun.misc.SignalHandler");
main = Thread.currentThread();
Method method = Signal.getMethod("handle", Signal, SignalHandler);

Object handler = Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]
{
SignalHandler
}, new InvocationHandler()
{
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
main.interrupt();
interruptPy();
return null;
}
});
Object intr = Signal.getDeclaredConstructor(String.class).newInstance("INT");
method.invoke(null, intr, getSignalHandler(SignalHandler, 2));
Object intrTerm = Signal.getDeclaredConstructor(String.class).newInstance("TERM");
method.invoke(null, intrTerm, getSignalHandler(SignalHandler, 15));
method.invoke(null, intr, handler);
} catch (InvocationTargetException | IllegalArgumentException | IllegalAccessException | InstantiationException | ClassNotFoundException | NoSuchMethodException | SecurityException ex)
{
// If we don't get the signal handler run without it. (ANDROID)
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ maintainers = [
description = "A Python to Java bridge"
readme = "README.rst"
requires-python = ">=3.8"
license = {text = "License :: OSI Approved :: Apache Software License"}
license = {text = "Apache-2.0"}
classifiers = [
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.8',
Expand Down
2 changes: 1 addition & 1 deletion setupext/test_java.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,4 +87,4 @@ def run(self):
self.announce(" %s" % " ".join(cmdStr), level=distutils.log.INFO)
subprocess.check_call(cmdStr)
subprocess.check_call(shlex.split(
"javadoc -Xdoclint:none test/harness/jpype/doc/Test.java -d test/classes/"))
"javadoc -Xdoclint:none test/harness/jpype/test/doc/Test.java -d test/classes/"))
111 changes: 88 additions & 23 deletions test/build.xml
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
<project default="test" name="JPype - Native">
<project default="test" name="JPype - Java test classes">

<property name="src" location="harness"/>
<property name="build" location="classes"/>
<property name="version" value="${ant.java.version}"/>
<property name="build9" location="classes-9"/>
<property name="jar.dir" location="jar"/>
<property name="version" value="${ant.java.version}"/>

<target name="test" depends="compile">
</target>
<target name="test" depends="compile,build-sample-package,build-late-jars,build-missing-jar,build-unsatisfied-jar,build-mrjar"/>

<condition property="build-9">
<not><or>
<equals arg1="${version}" arg2="1.8"/>
<equals arg1="${version}" arg2="1.7"/>
<equals arg1="${version}" arg2="1.8"/>
<equals arg1="${version}" arg2="1.7"/>
</or></not>
</condition>

Expand All @@ -20,54 +21,118 @@

<target name="compile-9" if="build-9">
<javac destdir="${build}"
source="${version}"
target="${version}"
>
source="${version}"
target="${version}">
<compilerarg value="--add-exports"/>
<compilerarg value="java.base/jdk.internal.reflect=ALL-UNNAMED"/>
<src>
<pathelement location="${src}/java9"/>
</src>
<include name="jpype/**/*"/>
<include name="org/jpype/**/*"/>
</javac>
</target>

<target name="compile-8" if="build-8">
<javac destdir="${build}"
source="${version}"
target="${version}"
>
source="${version}"
target="${version}">
<src>
<pathelement location="${src}/java8"/>
</src>
<include name="jpype/**/*"/>
<include name="org/jpype/**/*"/>
</javac>
</target>

<target name="compile-main">
<mkdir dir="${build}"/>
<javac destdir="${build}"
source="${version}"
target="${version}"
debug="true"
debuglevel="lines,vars,source"
>
source="${version}"
target="${version}"
debug="true"
debuglevel="lines,vars,source">
<src>
<pathelement location="${src}"/>
</src>
<include name="jpype/**/*"/>
<include name="org/**/*"/>
</javac>
<!-- <rmic base="${build}"
classname="jpype.rmi.ServerImpl"
/>
-->
</target>

<target name="compile" depends="compile-main,compile-8,compile-9"/>

<target name="clean">
<delete dir="${build}"/>
<delete dir="${build9}"/>
<delete dir="${jar.dir}"/>
</target>

<target name="init">
<mkdir dir="${jar.dir}"/>
</target>

<!-- Task 1: sample_package.jar -->
<target name="build-sample-package" depends="compile,init">
<jar destfile="${jar.dir}/sample_package.jar">
<fileset dir="${build}">
<include name="org/jpype/test/sample_package/**"/>
</fileset>
</jar>
</target>

<!-- Task 2: late.jar and late2.jar -->
<target name="build-late-jars" depends="compile,init">
<jar destfile="${jar.dir}/late/late.jar">
<fileset dir="${build}">
<include name="org/jpype/test/late/**"/>
</fileset>
</jar>
<jar destfile="${jar.dir}/late/late2.jar">
<fileset dir="${build}">
<include name="org/jpype/test/late2/**"/>
</fileset>
</jar>
</target>

<!-- Task 3: missing.jar -->
<target name="build-missing-jar" depends="compile,init">
<jar destfile="${jar.dir}/missing.jar">
<fileset dir="${build}">
<include name="org/jpype/missing/**"/>
</fileset>
</jar>
</target>

<!-- Task 5: unsatisfied.jar -->
<target name="build-unsatisfied-jar" depends="compile,init">
<jar destfile="${jar.dir}/unsatisfied.jar">
<fileset dir="${build}">
<include name="org/jpype/test/unsatisfied/**"/>
</fileset>
</jar>
</target>

<!-- Task 4: Automated MR-JAR build -->
<target name="build-mrjar" depends="init">
<!-- Compile Java 7 compatible classes -->
<mkdir dir="${build}"/>
<javac destdir="${build}" source="7" target="7">
<src path="${src}/org/jpype/mrjar"/>
<src path="${src}/org/jpype/mrjar/sub"/>
</javac>

<!-- Compile Java 9 classes into META-INF/versions/9 -->
<mkdir dir="${build}/META-INF/versions/9"/>
<javac destdir="${build}/META-INF/versions/9" source="9" target="9" release="9">
<src path="${src}/java9/org/jpype/mrjar"/>
</javac>

<!-- Create MR-JAR -->
<jar destfile="${jar.dir}/mrjar.jar">
<manifest>
<attribute name="Multi-Release" value="true"/>
</manifest>
<fileset dir="${build}"/>
</jar>
</target>

</project>
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

See NOTICE file for details.
**************************************************************************** */
package jpype.lambda;
package org.jpype.test.lambda;

import java.util.function.Function;

Expand Down
9 changes: 9 additions & 0 deletions test/harness/java9/org/jpype/mrjar/B.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.jpype.mrjar;

public class B
{
public String call()
{
return "9";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

See NOTICE file for details.
**************************************************************************** */
package jpype.method;
package org.jpype.test.method;

import jdk.internal.reflect.CallerSensitive;

Expand Down
24 changes: 0 additions & 24 deletions test/harness/jpype/str/Bad.java

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

See NOTICE file for details.
**************************************************************************** */
package jpype.array;
package org.jpype.test.array;

public class Test2
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

See NOTICE file for details.
**************************************************************************** */
package jpype.array;
package org.jpype.test.array;

public class TestArray
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

See NOTICE file for details.
**************************************************************************** */
package jpype.attr;
package org.jpype.test.attr;

import java.awt.image.BufferStrategy;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

See NOTICE file for details.
**************************************************************************** */
package jpype.attr;
package org.jpype.test.attr;

public class Holder
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

See NOTICE file for details.
**************************************************************************** */
package jpype.attr;
package org.jpype.test.attr;

public class SubHolder extends Holder implements java.io.Serializable
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

See NOTICE file for details.
**************************************************************************** */
package jpype.attr;
package org.jpype.test.attr;

import java.util.List;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

See NOTICE file for details.
**************************************************************************** */
package jpype.attr;
package org.jpype.test.attr;

public class Test1
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

See NOTICE file for details.
**************************************************************************** */
package jpype.attr;
package org.jpype.test.attr;

public class Test2 extends Test1
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

See NOTICE file for details.
**************************************************************************** */
package jpype.attr;
package org.jpype.test.attr;

public class TestKeywords
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

See NOTICE file for details.
**************************************************************************** */
package jpype.attr;
package org.jpype.test.attr;

public class TestOverloadA
{
Expand Down
Loading
Loading