android - 从 java 调用 native 方法时的 Libc SIGSEGV

标签 android c++ java-native-interface native-methods

我正在尝试让我的 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 中崩溃。 (它指的是我的应用程序,但请注意反向 dotcom 名称被截断了。我不确定这是否异常。) 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: "SUCCESSFUL", userId: "DefaultTestUser")

12-05 10:24:47.380: D/com.mycompany.amazoninapp.PurchasingObserver@41970368(4604): Posting event...

12-05 10:24:47.380: A/libc(4604): Fatal signal 11 (SIGSEGV) at 0x00000008 (code=1), thread 4604 (y.amazoninapp)

12-05 10:24:47.390: I/AmazonSDKTester(3529): Sending Purchase Updates Response Broadcast ({"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"}],"userId":"DefaultTestUser"})

我经历了正确获取 JNI 类名和方法签名字符串的迭代(我们已经过了 UnsatisfiedLinkErrors);我正在仔细检查空字符串。我的 JNI 的其余部分工作正常,亚马逊应用内购买 UI 显示正确。保证在注册 native 方法之前不会生成事件。

是什么导致了崩溃?

提前感谢您的输入。

最佳答案

您需要将您的函数声明为使用 C 调用约定。将其声明为 extern "C",如下所示:

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

关于android - 从 java 调用 native 方法时的 Libc SIGSEGV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13722056/

相关文章:

java - 子类化 ParseUser 时出现 ClassCastException (Parse.com)

c++ - 实现模板,我有问题 "matching function definitions to existing declarations"

java-native-interface - 带有 JNI 的 C++ 应用程序抛出错误 "jvm.dll not found . re-installing the application could fix ...."

java - NDK - 从 ARGB_8888 位图中处理没有 Alpha 的 RGB 值

Android 如何从双卡手机获取电话号码

java - Android 即时功能 : Is it something fundamentally flawed with this approach?

android - 使用 Firebase 身份验证进行身份验证后检索 Google 访问 token

c++ - CMake/CTest 代码覆盖检查

python - 树莓派 i2c 读/写错误

java - 加载 JNI Dll