Про JNI, к сожалению, не знаю.
А почему не подходит какая-нибудь кастомная обертка над isReachable (и потенциально даже над либой от Verax для совместимости), которая его «обасинхронит» и даст возможность пинговать любое количество хостов?
С точки зрения наивной реализации это может быть как-то так:
private ExecutorService executor;
public Map<InetAddress, Future<Boolean>> pingHosts(List<InetAddress> addrs) {
Map<InetAddress, Future<Boolean>> results = new HashMap<>();
for (final InetAddress addr : addrs) {
Future<Boolean> pingResult = executor.submit(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
return addr.isReachable(10000);
}
});
results.put(addr, pingResult);
}
return results;
}