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;
}
};
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
Warum rufen Sie nicht einfach eine Java-Methode auf und erstellen dort die Absicht? – bendaf
aus Leistungsgründen – Cumatru