c++ 从java调用本机方法时使用Libc SIGSEGV

x6492ojm  于 2023-03-20  发布在  Java
关注(0)|答案(2)|浏览(122)

我正在尝试让Amazon应用内购买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
}

亚马逊应用程序购买处理程序. 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,它还记录“Posting event...",调用postEvent()之前的最后一件事。3,程序在libc中崩溃,并带有SIGSEGV。(它引用了我的应用程序,但请注意,反向dotcom名称被截断。我不确定这是否异常。)4,C++ _NativePurchasingObserverPostEvent中的跟踪从未达到。
日志:
12月5日10时24分47秒380秒D/com. mycompany. amazoninapp.采购观察员@41970368(4604):获取用户ID响应时:(获取用户ID响应@4196cf98,请求ID:“dcf 8 e712 - 078 b-4d 47 -9533-ee 9ae 544 f53 d”,获取用户标识请求状态:“成功”,用户ID:“默认测试用户”)
12月5日10时24分47秒380秒D/com. mycompany. amazoninapp.采购观察员@41970368(4604):正在发布事件...
12月5日10时24分47秒380秒A/libc(4604):0x 00000008(代码=1)处的致命信号11(SIGSEGV),线程4604(y.amazoninapp)
12月5日10时24分47秒39秒我/亚马逊SDK测试仪(3529):正在发送购买更新响应广播({“撤销的SKU”:[],“偏移量”:“1354703087397”,“状态”:“成功”,“请求ID”:“b 9aee 42 e-4f 50 - 42 c4 - 8a 12-ba 9 eb 1d 19155”,“是更多”:假,“接收”:[{“SKU”:“com.mycompany.amazoninapp.ENTI01”,“令牌”:“eyJ0eXBlIjoiTk9OQ09OU1VNQUJMRSInNrdSI6ImNvbS5wbGF5ZXJ0aHJlZS5hbWF6b25pbmFw\ncC5FTlRJMDEifQ\n”,“项目类型”:“标题”}],“用户ID”:“默认测试用户”})
我经历了获得正确的JNI类名和方法签名字符串的迭代(我们已经通过了UnsatisfiedLinkErrors);我仔细检查了空字符串。我的JNI的其余部分工作正常,Amazon应用内购买UI显示正确。在注册本机方法之前,保证不会生成事件。
是什么导致了这次坠机?
感谢您提前输入。

jslywgbw

jslywgbw1#

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

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

4ioopgfo2#

尝试使用javah创建一个头文件,并将其#include到C++代码中,而不是自己编写函数原型。

相关问题