Разрабатывается Java-приложение, использующее JNI. Он включает в себя следующий класс Java:
package data.jni;
import org.bytedeco.javacpp.Pointer;
@Platform(include = { "LicenseManagerNative.h" })
@Namespace("kfo")
public class LicenseManagerNative extends Pointer
{
public LicenseManagerNative()
{
allocate();
}
private native void allocate();
public native int checkOutLicense(String module, String version);
public native void checkInLicense(String module);
public native void reload();
}
Как видно, этот класс использует native
методы. Существует также использование ProGuard. Пока он работает только с оптимизацией ProGuard, однако при включении минификации ProGuard возникает странная проблема. Во время выполнения я получаю такие ошибки, как java.lang.ClassNotFoundException: data.jni.LicenseManagerNative
, который и есть этот класс, содержащий native
методы.
В конфигурации ProGuard активно правило, гласящее, что классы, включающие native
функции, должны быть сохранены, указав:
-keep,includedescriptorclasses class * {
native <methods>;
}
Если для JAR, созданного ProGuard с использованием этого правила, используется декомпилятор, то класс LicenseManagerNative
по-прежнему отсутствует.
Что вызывает такое поведение? Правило ProGuard определено неправильно? Поскольку в классе присутствуют native
функции, я ожидаю, что они будут сохранены, однако класс просто удаляется с помощью задачи «minify» ProGuard.