【发布时间】:2012-11-23 05:01:33
【问题描述】:
我正在尝试让我的 Amazon In-app Purchases SDK 的 PurchasingObserver 的 java 实现通过本机方法与我的 C++ 代码进行通信。
PurchasingObserver.java //摘录
public class PurchasingObserver
{
//...
private native void postEvent(int type, String jsonData);
// called by each of the four event handler methods, data is non-null
// also tried it as native synchronized
}
AmazonInAppPurchaseHandler.cpp //摘录
static AmazonInAppPurchaseHandler* AmazonInAppPurchaseHandler::s_pInstance(0); // dumbleton
JNIEXPORT void JNICALL _NativePurchasingObserverPostEvent(JNIEnv* pEnv, jobject obj, jint type, jstring jsonData)
// friend function
{
assert(type >= 0);
assert(type < AmazonInAppPurchaseHandler::kNumEventTypes); // event type is in range
assert(pEnv != 0); // JNI environment is valid
printf("Stuff from the native callback: %d, %p\n", type, jsonData); // never gets printed.
int jsonDataLen(0);
const char* pJsonDataUtfChars(0);
if(jsonData != 0)
{
jsonDataLen = pEnv->GetStringUTFLength(jsonData);
pJsonDataUtfChars = pEnv->GetStringUTFChars(jsonData, 0);
}
assert(s_pInstance != 0); // got AmazonInAppPurchaseHandler instance
s_pInstance->DoCallback(type, jsonDataLen, pJsonDataUtfChars);
pEnv->ReleaseStringUTFChars(jsonData, pJsonDataUtfChars);
}
static const JNINativeMethod karNativeMethod[] =
{
{
"postEvent",
"(ILjava/lang/String;)V",
(void*)&_NativePurchasingObserverPostEvent
}
};
AmazonInAppPurchaseHandler::AmazonInAppPurchaseHandler()
{
assert(s_pInstance == 0); // is only instance
s_pInstance = this;
JNIEnv* pEnv(GetJNIEnv());
assert(pEnv != 0); // got JNI environment
jint result(pEnv->RegisterNatives(cPurchaseObserver, karNativeMethod, 1));
assert(AmazonInAppPurchaseHandler, result == 0); // successfully registered
}
AmazonInAppPurchaseHandler::~AmazonInAppPurchaseHandler()
{
s_pInstance = 0;
}
只要我执行任何生成事件的操作,就会发生以下情况: 1,事件处理程序被正确调用,它进行日志记录。 2,它还记录“发布事件...”,这是调用 postEvent() 之前的最后一件事。 3,程序在 libc 中崩溃并带有 SIGSEGV。 (它指的是我的应用程序,但请注意反向 .com 名称被截断。我不确定这是否不寻常。) 4、C++ _NativePurchasingObserverPostEvent 中的追踪永远不会到达。
日志:
12-05 10:24:47.380: D/com.mycompany.amazoninapp.PurchasingObserver@41970368(4604): onGetUserId 响应: (com.amazon.inapp.purchasing.GetUserIdResponse@4196cf98, requestId: “dcf8e712-078b-4d47-9533-ee9ae544f53d”,getUserIdRequestStatus: "SUCCESSFUL", userId: "DefaultTestUser")
12-05 10:24:47.380: D/com.mycompany.amazoninapp.PurchasingObserver@41970368(4604): 发布活动...
12-05 10:24:47.380: A/libc(4604): 致命信号 11 (SIGSEGV) 在 0x00000008(代码=1),线程4604(y.amazoninapp)
12-05 10:24:47.390:I/AmazonSDKTester(3529):发送购买更新 响应广播 ({"revokedSkus":[],"offset":"1354703087397","status":"SUCCESSFUL","requestId":"b9aee42e-4f50-42c4-8a12-ba9eb1d19155","isMore":false,"receipts" :[{"sku":"com.mycompany.amazoninapp.ENTI01","token":"eyJ0eXBlIjoiTk9OQ09OU1VNQUJMRSIsInNrdSI6ImNvbS5wbGF5ZXJ0aHJlZS5hbWF6b25pbmFw\ncC5FTlRJMDEifQ\n","itemType"":"ENTITLED"}})user," p>
我经历了正确获取 JNI 类名和方法签名字符串的迭代(我们已经过去了 UnsatisfiedLinkErrors);我正在仔细检查空字符串。我的 JNI 的其余部分工作正常,亚马逊应用内购买 UI 正确显示。在注册本机方法之前,保证不会生成事件。
导致崩溃的原因是什么?
提前感谢您的意见。
【问题讨论】:
-
启动程序,然后启动 gdb 并附加到程序的 PID。这应该可以帮助您隔离空指针访问的上下文。
-
AmazonInAppPurchaseHandler 构造函数是否被调用?你在哪里创建对象?
-
我刚刚遇到了同样的问题。你还记得是什么解决了这个问题吗?
标签: android c++ java-native-interface amazon native-methods