public void testSynchronizedAccess() throws Exception { final boolean[] lockHeld = {false}; final NativeLibrary nlib = NativeLibrary.getInstance("testlib", TestLib.class.getClassLoader()); final TestLib lib = (TestLib) Native.loadLibrary("testlib", TestLib.class); final TestLib synchlib = (TestLib) Native.synchronizedLibrary(lib); final TestLib.VoidCallback cb = new TestLib.VoidCallback() { public void callback() { lockHeld[0] = Thread.holdsLock(nlib); } }; Thread t0 = new Thread() { public void run() { lib.callVoidCallback(cb); } }; t0.start(); t0.join(); assertFalse( "NativeLibrary lock should not be held during native call to normal library", lockHeld[0]); Thread t1 = new Thread() { public void run() { synchlib.callVoidCallback(cb); } }; t1.start(); t1.join(); assertTrue( "NativeLibrary lock should be held during native call to synchronized library", lockHeld[0]); }