ProGuard выбрасывает родной класс, который должен быть в состоянии сохранить - PullRequest
0 голосов
/ 07 января 2019

Разрабатывается 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.

1 Ответ

0 голосов
/ 08 января 2019

Вы пытались 1) сохранить класс по имени 2) сохранить класс, используя -keepclasseswithmembers? -keep *; - очень широкое правило; если бы Proguard реализовал это буквально, он должен был бы сохранить все ваши классы. И это не то же самое, что -keepclasseswithmembers!

...