2016-05-18 17 views
10

Yerel cpp kodundan bir niyet çağırmaya çalışıyorum. Temel olarak, anladığım kadarıyla, framework/base/core/java/android/app/ActivityManagerNative.java'dan tam serileştirme dizisini eşleştirmek için bir Parsel oluşturmak zorundayım; BROADCAST_INTENT_TRANSACTION durumu.Native cpp uygulamasındaki Niyet İçindeki Bundle Bağlayıcı

Şu ana kadarki süreç, bir Java uygulamasında niyetimi aldığım, ancak paket yüküyle ilgili bir sorunum olduğu. Java uygulamasını ayıkladım ve paketin anahtarları için türü tutan int'yi okumak yerine çöpü bir int olarak okuyormuş gibi görünüyor. her zaman bir dize olduğu için

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

anahtar türü gerekli değildir:

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 

İşte

#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

Tüm android projelerde bir bildirim dosyası olmalıdır. Derleyici, aksi halde apk oluşturmak için bilmeyecektir. Ex 1, aksesuarların altında kök klasörde bir manifestoya sahiptir. Ex2 sadece bir kod parçasıdır.Ex3 kök dizininde bir manifestoya sahiptir. – Striker

+0

Neden bir java yöntemini aramıyor ve orada niyet yaratmıyorsunuz? – bendaf

+0

performans nedenleri için – Cumatru

cevap

0

kaldır kod aşağıda kullanılan doğal koddur. Bu alan sıradan değil, sonra unmarshall etmeyin.