2016-05-18 13 views
10

Tôi đang cố gọi một ý định từ mã cpp gốc. Về cơ bản, từ những gì tôi đã hiểu, tôi phải soạn một bưu kiện để phù hợp với trình tự deserialization chính xác từ khung/cơ sở/core/java/android/app/ActivityManagerNative.java; trường hợp BROADCAST_INTENT_TRANSACTION.Gói bên trong Mục đích từ ứng dụng gốc cpp sử dụng Binder

Tiến trình cho đến nay là tôi đã nhận được ý định trong một ứng dụng Java, nhưng tôi có một số vấn đề với tải trọng của gói. Tôi đã gỡ rối các ứng dụng Java và có vẻ như nó đọc rác như một int thay vì đọc int mà giữ kiểu cho các phím của gói.

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 

Đây là mã có nguồn gốc sử dụng

#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ất cả các dự án Android phải có tệp kê khai. Trình biên dịch sẽ không biết cách xây dựng gói ứng dụng khác. Ví dụ 1 có tệp kê khai trong thư mục gốc dưới các phụ kiện. Ex2 chỉ là một đoạn mã .Ex3 có tệp kê khai trong thư mục gốc. – Striker

+0

Tại sao bạn không chỉ gọi một phương thức java và tạo ra ý định đó? – bendaf

+0

vì lý do hiệu suất – Cumatru

Trả lời

0

đang remove dưới đây:

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

loại chính là không cần thiết vì nó luôn luôn là một chuỗi. Trường này không phải là marshalled, sau đó không unmarshall nó.

Các vấn đề liên quan