ProGuard抛出了它应该能够保留的本机类

时间:2019-01-07 12:35:07

标签: java java-native-interface proguard native

正在开发使用JNI的Java应用程序。它包含以下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>;
}

当使用该规则在ProGuard生产的JAR上使用反编译器时,仍然不再存在LicenseManagerNative类。

是什么原因导致这种现象? ProGuard规则定义不正确吗?由于类中存在native个函数,因此我希望保留它们,但是ProGuard的“缩小”任务只是删除了该类。

1 个答案:

答案 0 :(得分:0)

您是否尝试过1)使用名称保留课程2)使用-keepclasseswithmembers保留课程? -keep *;是一个非常广泛的规则;如果Proguard确实实现了它,则必须保留所有类。而且与-keepclasseswithmembers