1

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、プログラムは SIGSEGV を使用して libc でクラッシュします。(私のアプリケーションを参照していますが、逆のドットコム名が切り捨てられていることに注意してください。これが異常かどうかはわかりません。) 4、C++ _NativePurchasingObserverPostEvent のトレースに到達しません。

ログ:

12-05 10:24:47.380: D/com.mycompany.amazoninapp.PurchasingObserver@41970368(4604): onGetUserIdResponse: (com.amazon.inapp.purchasing.GetUserIdResponse@4196cf98, requestId: "dcf8e712-078b-4d47-9533- ee9ae544f53d"、getUserIdRequestStatus: "成功"、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","re​​questId": "b9aee42e-4f50-42c4-8a12-ba9eb1d19155","isMore":false,"receipts":[{"sku":"com.mycompany.amazoninapp.ENTI01","token":"eyJ0eXBlIjoiTk9OQ09OU1VNQUJMRSIsInNrdSI6ImNvbS5wbGF5ZXJ0aHJlZS5hbWF6b25pbmFw\ncC5FTlRJMDEifQ\n", "itemType":"ENTITLED"}],"userId":"DefaultTestUser"})

JNI クラス名とメソッド シグネチャ文字列を正しく取得するための反復を行いました (UnsatisfiedLinkErrors は過去のものです)。null 文字列を再確認しています。JNI の残りの部分は正常に動作し、Amazon アプリ内購入 UI は正しく表示されます。ネイティブ メソッドを登録する前に、イベントが生成されないことが保証されます。

クラッシュの原因は何ですか?

事前にご入力いただきありがとうございます。

4

2 に答える 2

0

C呼び出し規約を使用するものとして関数を宣言する必要があります。次のように宣言しますextern "C"

extern "C" void _NativePurchasingObserverPostEvent(JNIEnv* pEnv, jobject obj, jint type, jstring jsonData)
于 2012-12-05T11:32:00.117 に答える
0

関数プロトタイプを自分で作成する代わりに、C++ コードにjavahヘッダーを作成するために使用してみてください。#include

于 2014-07-29T23:25:29.190 に答える