2012-12-05 28 views
1

我試圖讓我的java實現亞馬遜應用內購買SDK的PurchasingObserver通過本地方法與我的C++代碼進行通信。Libc SIGSEGV從java調用本地方法時

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()之前記錄「Posting event ...」,這是最後一件事情。 3,程序在libc中用SIGSEGV崩潰。 (它指的是我的應用程序,但請注意反向dotcom名稱被截斷,我不確定這是否是不尋常的。) 4,C++ _NativePurchasingObserverPostEvent中的跟蹤從未達到。

日誌:

10月12日至5日:24:47.380: D/[email protected](4604): onGetUserIdResponse: (com.amazon.inapp.purchasing。 GetUserIdResponse @ 4196cf98,的requestId: 「dcf8e712-078b-4d47-9533-ee9ae544f53d」,getUserIdRequestStatus: 「成功」,用戶名: 「DefaultTestUser」)

十月12日至5日:24:47.380: d/COM。 [email protected](4604):在 0x00000008(代碼= 1),螺紋4604(y.amazoninapp)

致命信號11(SIGSEGV):發佈事件...

十月12日至5日:24:47.380:A/libc的(4604)

12-05 10:24:47.390 I/AmazonSDKTester(3529):發送購買更新 響應廣播 ({「revokedSkus」:[],「offset」:「1354703087397」,「status」:「SUCCESSFUL」, 「的requestId」: 「b9aee42e-4f50-42c4-8a12-ba9eb1d19155」, 「isMore」:假 「收據」:[{ 「SKU」: 「com.mycompany.amazoninapp.ENTI01」, 「標記」:「eyJ0eXBlIjoiTk9OQ09OU1VNQUJMRSIsInNrdSI6ImNvbS5wbGF5ZXJ0aHJlZS5hbWF6b25pbmFw \ ncC5FTlRJMDEifQ \ n「,」itemType「:」ENTITLED「}],」userId「:」DefaultTestUser「})

我經歷了獲取JNI類名和方法簽名字符串的迭代(我們已經過去了UnsatisfiedLinkErrors);我正在對空字符串進行雙重檢查。我的其餘JNI工作正常,亞馬遜的應用內購買用戶界面顯示正確。保證在註冊本地方法之前不會生成事件。

什麼導致了崩潰?

謝謝您的提前意見。

+0

啓動您的程序,然後啓動gdb並附加到您的程序的PID。這應該有助於您隔離空指針訪問的上下文。 – technomage

+0

AmazonInAppPurchaseHandler構造函數是否被調用?你在哪裏創建對象? –

+0

我剛碰到同樣的問題。你記得什麼解決這個問題? – ephemer

回答

0

您需要聲明您的功能爲使用C調用約定。聲明爲extern "C"爲:

extern "C" void _NativePurchasingObserverPostEvent(JNIEnv* pEnv, jobject obj, jint type, jstring jsonData) 
+0

謝謝你的建議;我已經遵循了它,然後cleanbuilt並重新部署了該應用程序,但是恐怕仍然在發生崩潰,併產生完全相同的錯誤消息。 (我也嘗試將JNIEXPORT void JNICALL添加到聲明中,無濟於事。) – zyndor

0

使用javah創建一個標題,你#include到你的C++代碼,而不是寫的函數原型自己嘗試。