2016-05-18 4 views
10

Ich versuche, eine Absicht aus nativem cpp-Code aufzurufen. Grundsätzlich, aus dem, was ich verstanden habe, muss ich ein Paket zusammenstellen, um die genaue Deserialisierung Sequenz von Frameworks/Base/Core/Java/Android/app/ActivityManagerNative.java entsprechen; Fall BROADCAST_INTENT_TRANSACTION.Bundle Intent aus Native cpp-Anwendung mit Binder

Der bisherige Fortschritt ist, dass ich die Absicht in einer Java-App erhalten habe, aber ich habe ein Problem mit der Bundle-Payload. Ich habe die Java-App debuggt und es scheint, dass es Müll als int liest, anstatt den int zu lesen, der den Typ für die Schlüssel des Bündels enthält.

W/System.err(1386): java.lang.RuntimeException: Parcel [email protected]: Unmarshalling unknown type code 6815843 at offset 12 
W/System.err(1386): at android.os.Parcel.readValue(Parcel.java:2228) 
W/System.err(1386): at android.os.Parcel.readArrayMapInternal(Parcel.java:2485) 
W/System.err(1386): at android.os.BaseBundle.unparcel(BaseBundle.java:221 

Hier ist der native Code verwendet

#include <unistd.h> 
#include <binder/IBinder.h> 
#include <binder/IServiceManager.h> 
#include <binder/Parcel.h> 
#include <utils/String8.h> 
#include <assert.h> 

namespace android { 

static const int BROADCAST_INTENT_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION + 13; 

int send_intent() 
{ 
    int NULL_TYPE_ID = 0; 

    sp<IServiceManager> sm = defaultServiceManager(); 
    sp<IBinder> am = sm->checkService(String16("activity")); 
    assert(am != NULL); 

    Parcel data, reply; 
    data.writeInterfaceToken(String16("android.app.IActivityManager")); 
    data.writeStrongBinder(NULL); 

    /*intent*/ 

    data.writeString16(String16("com.etc.etc.receiver")); /* action */ 

    data.writeInt32(NULL_TYPE_ID); /* mData */ 
    data.writeString16(NULL, 0); /* type */ 
    data.writeInt32(0); /* flags */ 
    data.writeString16(NULL, 0); /* package name */ 
    data.writeString16(NULL, 0); /* ComponentName - class */ 

    data.writeInt32(0); /* no source bounds */ 
    data.writeInt32(0); /* no categories */ 

    /* skip categories */ 

    data.writeInt32(0); /* no selector */ 
    data.writeInt32(0); /* no clip data */ 
    data.writeInt32(0); /* content user hint */ 


    { /* Extras Bundle */ 
     data.writeInt32(0); /* dummy, will hold length */ 

     data.writeInt32(0x4C444E42); // 'B' 'N' 'D' 'L' 
     int oldPos = data.dataPosition(); 
     { /* writeMapInternal */ 
      data.writeInt32(2); /* writeMapInternal - size in pairs */ 

      data.writeInt32(VAL_STRING); /* type for key */ 
      data.writeString16(String16("first")); /* key */ 
      data.writeInt32(VAL_INTEGER); /* type for value */ 
      data.writeInt32(1337); /* value */ 

      data.writeInt32(VAL_STRING); /* type for key */ 
      data.writeString16(String16("second")); /* key */ 
      data.writeInt32(VAL_INTEGER); /* type for value */ 
      data.writeInt32(1338); /* value */ 


     } 
     int newPos = data.dataPosition(); 
     data.setDataPosition(oldPos - 8); /* eight bytes: size integer + bundle integer */ 
     int difference = newPos - oldPos; 
     data.writeInt32(difference); /* total length of the bundle */ 

     data.setDataPosition(newPos); 
    } 

    data.writeString16(NULL, 0); /* resolvedType */ 
    data.writeStrongBinder(NULL); /* resultTo */ 
    data.writeInt32(-1);   /* resultCode */ 
    data.writeString16(NULL, 0); /* resultData */ 
    data.writeInt32(-1);  /* result extras */ 

    data.writeString16(NULL, 0); /* grant all permissions */ 
    data.writeInt32(0); /* appOp */ 
    data.writeInt32(0); /* serialized */ 
    data.writeInt32(0); /* sticky */ 
    data.writeInt32(0); /* userid */ 

    status_t ret = am->transact(BROADCAST_INTENT_TRANSACTION, data, &reply); 

    if (ret == NO_ERROR) 
    { 
     int32_t exceptionCode = reply.readExceptionCode(); 
     if (!exceptionCode) 
     { 
      ALOGD("sendBroadcast succeed\n"); 
     } 
     else 
     { 
      // An exception was thrown back; fall through to return failure 
      ALOGE("sendBroadcastcaught exception %d\n", exceptionCode); 
     } 
    } 
    else 
    { 
     ALOGD("am->transact returned: %d", ret); 
    } 

    return 0; 
} 
}; 
+0

Alle Android-Projekte sollten eine Manifest-Datei haben. Der Compiler wird sonst nicht wissen, wie er die Apk erstellt. Ex 1 hat das Manifest im Stammordner unter Zubehör. Ex2 ist nur ein Codefragment. Ex3 hat das Manifest im Stammverzeichnis. – Striker

+0

Warum rufen Sie nicht einfach eine Java-Methode auf und erstellen dort die Absicht? – bendaf

+0

aus Leistungsgründen – Cumatru

Antwort

0

entfernen Code unten:

data.writeInt32(VAL_STRING); /* type for key */ 

der Schlüsseltyp nicht benötigt, weil es immer eine Zeichenfolge ist. Dieses Feld wird nicht gemarshallt, entlarvt es nicht.

Verwandte Themen