diff --git a/README.md b/README.md index b2f46b0c..46859312 100644 --- a/README.md +++ b/README.md @@ -120,6 +120,12 @@ For Maven: ``` +### Android Compatibility + +jCasbin is fully compatible with Android API 23+ (Android 6.0 Marshmallow and later). The library uses AviatorScript in **interpreter mode** to ensure compatibility with older Android versions that don't support MethodHandle APIs (which require API 26+). + +No special configuration is needed - jCasbin automatically uses interpreter mode for all platforms, making it safe to use on Android devices running API 23 and above. + ## Documentation https://casbin.org/docs/overview diff --git a/src/main/java/org/casbin/jcasbin/main/CoreEnforcer.java b/src/main/java/org/casbin/jcasbin/main/CoreEnforcer.java index 23c7ab32..f51dc13d 100644 --- a/src/main/java/org/casbin/jcasbin/main/CoreEnforcer.java +++ b/src/main/java/org/casbin/jcasbin/main/CoreEnforcer.java @@ -19,6 +19,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.AviatorEvaluatorInstance; +import com.googlecode.aviator.EvalMode; import com.googlecode.aviator.Expression; import com.googlecode.aviator.runtime.type.AviatorFunction; import org.casbin.jcasbin.effect.DefaultEffector; @@ -76,7 +77,7 @@ void initialize() { autoSave = adapter instanceof FileAdapter ? false : true; autoBuildRoleLinks = true; dispatcher = null; - aviatorEval = AviatorEvaluator.newInstance(); + aviatorEval = AviatorEvaluator.newInstance(EvalMode.INTERPRETER); initRmMap(); initBuiltInFunction(); } diff --git a/src/test/java/org/casbin/jcasbin/main/BuiltInFunctionsUnitTest.java b/src/test/java/org/casbin/jcasbin/main/BuiltInFunctionsUnitTest.java index 462c208c..06dd9da5 100644 --- a/src/test/java/org/casbin/jcasbin/main/BuiltInFunctionsUnitTest.java +++ b/src/test/java/org/casbin/jcasbin/main/BuiltInFunctionsUnitTest.java @@ -16,6 +16,7 @@ import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.AviatorEvaluatorInstance; +import com.googlecode.aviator.EvalMode; import org.casbin.jcasbin.util.BuiltInFunctions; import org.casbin.jcasbin.util.Util; import org.testng.annotations.Test; @@ -248,7 +249,7 @@ public void testEvalFunc() { testEval("r_sub.name == 'alice'", env, null, true); testEval("r_sub.name == 'bob'", env, null, false); - AviatorEvaluatorInstance aviatorEval = AviatorEvaluator.newInstance(); + AviatorEvaluatorInstance aviatorEval = AviatorEvaluator.newInstance(EvalMode.INTERPRETER); aviatorEval.addFunction(new FunctionTest.CustomFunc()); env.put("r_obj", "/test/url1/url2"); diff --git a/src/test/java/org/casbin/jcasbin/main/ManagementAPIUnitTest.java b/src/test/java/org/casbin/jcasbin/main/ManagementAPIUnitTest.java index 54c0aadb..e3d6145d 100644 --- a/src/test/java/org/casbin/jcasbin/main/ManagementAPIUnitTest.java +++ b/src/test/java/org/casbin/jcasbin/main/ManagementAPIUnitTest.java @@ -16,6 +16,7 @@ import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.AviatorEvaluatorInstance; +import com.googlecode.aviator.EvalMode; import org.testng.Assert; import org.testng.annotations.Test; @@ -290,7 +291,7 @@ public void should_throwsNullPointException_when_setAviatorEvaluator_given_nullI @Test public void should_true_when_setAviatorEvaluator_given_customInstance() { // given - AviatorEvaluatorInstance instance = AviatorEvaluator.newInstance(); + AviatorEvaluatorInstance instance = AviatorEvaluator.newInstance(EvalMode.INTERPRETER); Enforcer enforcer = new Enforcer(); // when enforcer.setAviatorEvaluator(instance);