User
User

Reputation: 287

In Android, how to invoke sun.misc.Unsafe methods using Java reflection?

Although there are similar questions (such as A, B and C), their answers do not solve my problem.

I am using Android Studio 1.5.1 targeting Android API 18 (before Android KitKat 4.4, so I’m dealing with Dalvik, not ART runtime).

My questions are:

(1) When I use the following code, I can print a list of all sun.misc.Unsafe methods available in Android, so I think I have access to them using reflection but I do not know how to call them using reflection.

(2) If (1) is possible, how to find the magicNumber (in the code below) address using sun.misc.Unsafe methods in Android via reflection?

(3) If (1) is possible but (2) is not possible, how to put an integer number (say int test=123) in any native memory address and print its memory address using sun.misc.Unsafe methods in Android via reflection?

        String ClassName = "sun.misc.Unsafe";
        int magicNumber = 0x23420023 ;
    try {
        Class classToInvestigate = Class.forName(ClassName);
        Constructor[] aClassConstructors = classToInvestigate.getDeclaredConstructors();
        for(Constructor c : aClassConstructors){
            System.out.println("********************* constructor="+c);
        }

        Method[] aClassMethods = classToInvestigate.getDeclaredMethods();
        for(Method m : aClassMethods){
            System.out.println("********************* method="+m);

        }
        Field theUnsafe = classToInvestigate.getDeclaredField("THE_ONE");
        theUnsafe.setAccessible(true);
        Object unsafe = theUnsafe.get(null);

    } catch (ClassNotFoundException e) {
        // Class not found!
    }
    catch (Exception e) {
        // Unknown exception
    }

Upvotes: 1

Views: 6514

Answers (2)

Alexander Efremenkov
Alexander Efremenkov

Reputation: 147

Unfortunately sun.misc.Unsafe class not included in android standard library and you should use it between reflection but I found another solution: to use it between pre-compiled direct proxy class from my library: https://github.com/iamironz/unsafe

Upvotes: 1

noctarius
noctarius

Reputation: 6104

This class will return you an Unsafe instance on almost all existing JVM implementations including Android (both VM versions): https://github.com/noctarius/tengi/blob/master/java/tengi-core/src/main/java/com/noctarius/tengi/core/impl/UnsafeUtil.java

Upvotes: -3

Related Questions