正在开发使用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的“缩小”任务只是删除了该类。
答案 0 :(得分:0)
您是否尝试过1)使用名称保留课程2)使用-keepclasseswithmembers
保留课程? -keep *;
是一个非常广泛的规则;如果Proguard确实实现了它,则必须保留所有类。而且与-keepclasseswithmembers
是不!