相关疑难解决方法(0)

捕获在Android上运行的本机代码引发的异常

我正在进行的项目要求我编写跨平台程序实现的android部分.

构建了一组核心功能,并将其包含在我的应用程序中android-ndk.我发现在本机代码中发生的任何异常/崩溃只会在现在和最后再次报告.发生错误时,我会收到以下行为之一:

  • 发生堆栈跟踪/内存转储并将其写入日志文件.该程序消失(设备上没有指示为什么突然该应用程序不再存在).
  • 没有给出堆栈跟踪/转储或其他指示本机代码已崩溃.该程序消失了.
  • java代码崩溃了NullPointerException(通常在每个本机代码异常的相同位置,这是一个巨大的痛苦).通常会让我花费一段时间来尝试调试为什么Java代码抛出错误只是为了发现Java代码很好并且本机代码错误已被完全掩盖.

我似乎无法找到任何方法来"隔离"我的代码以防止在本机代码中发生的错误.Try/catch语句被彻底忽略了.除了我的代码被指责为罪魁祸首之外,我甚至没有机会警告用户而不是发生错误.

有人可以帮我解决如何应对崩溃本机代码的情况吗?

java-native-interface android exception-handling nullpointerexception android-ndk

51
推荐指数
2
解决办法
3万
查看次数

SEGV_ACCERR是什么意思?

我正在检查一些崩溃,所有崩溃都有SIGSEGV信号,原因是SEGV_ACCERR.在搜索SEGV_ACCERR之后,我发现最接近人类可读解释的是:对象的无效权限

这在更一般意义上意味着什么?何时出现SEGV_ACCERR?关于这个原因有更具体的文件吗?

c c++ signals objective-c

27
推荐指数
3
解决办法
2万
查看次数

奇怪的原生崩溃 - pid:0,tid:0信号11(SIGSEGV),代码1(SEGV_MAPERR)

我在android上遇到了这个奇怪的崩溃

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
pid: 0, tid: 0 >>> com.oimvo.discdj <<<

backtrace:
  #00  pc 000000000001d050  /data/app/com.oimvo.discdj-2/lib/arm64/libavfilter.7.11.101.so (av_fastresampler_resample_s16+1944)
  #01  pc 000000000001c930  /data/app/com.oimvo.discdj-2/lib/arm64/libavfilter.7.11.101.so (av_fastresampler_resample_s16+120)
Run Code Online (Sandbox Code Playgroud)

和另一个类似的崩溃

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
pid: 0, tid: 0 >>> com.oimvo.discdj <<<

backtrace:
  #00  pc 0000000000083770  /system/lib/egl/libGLES_mali.so
  #01  pc 0000000000096ac0  /system/lib/egl/libGLES_mali.so
  #02  pc 0000000000095878  /system/lib/egl/libGLES_mali.so
  #03  pc 0000000000095f14  /system/lib/egl/libGLES_mali.so
  #04  pc 000000000003c870  /system/lib/egl/libGLES_mali.so …
Run Code Online (Sandbox Code Playgroud)

java-native-interface android native segmentation-fault

12
推荐指数
0
解决办法
1269
查看次数

将Java数组中任意范围的元素设置为null的最快方法是什么?

我知道我可以简单地从迭代startend和清除这些细胞,但我想知道,如果它(可能使用JNI-ED是任何更快的方式可能System.arrayCopy)?

java performance java-native-interface arraycopy

11
推荐指数
1
解决办法
582
查看次数

将字节数组从Unity传递到Android(C ++)进行修改

我正在尝试使用本机库来修改字节数组(实际上是uint16数组)的内容。我在Unity(C#)中具有数组,在C ++中具有本机库。

我尝试了几件事,我能做的最好的事情就是成功调用本机代码并能够将布尔值返回给C#。当我在C ++中传递数组并将其变异时,问题就来了。不管我做什么,该数组在C#中都保持不变。

这是我在Unity方面拥有的东西:

// In Update().
using (AndroidJavaClass processingClass = new AndroidJavaClass(
"com.postprocessing.PostprocessingJniHelper"))
{
   if (postprocessingClass == null) {
       Debug.LogError("Could not find the postprocessing class.");
       return;
   }

   short[] dataShortIn = ...;  // My original data.
   short[] dataShortOut = new short[dataShortIn.Length];
   Buffer.BlockCopy(dataShortIn, 0, dataShortOut, 0, dataShortIn.Length);

   bool success = postprocessingClass.CallStatic<bool>(
        "postprocess", TextureSize.x, TextureSize.y, 
        dataShortIn, dataShortOut);

   Debug.Log("Processed successfully: " + success);
}
Run Code Online (Sandbox Code Playgroud)

Unity项目在Plugins / Android中具有postprocessing.aar,并已为Android构建平台启用。我在Java中有一个JNI层(已成功调用):

public final class PostprocessingJniHelper {

  // Load JNI methods
  static {
    System.loadLibrary("postprocessing_jni");
  }

  public static …
Run Code Online (Sandbox Code Playgroud)

c# c++ java-native-interface android unity-game-engine

5
推荐指数
1
解决办法
227
查看次数

cpp - valgrind - 大小为8的读取无效

我疯狂地理解valgrind的错误.我有一个名为Matrix的模板类,它有一些重载的运算符等......来做一些数学运算.Matrixes在名为ExtendedKalmanFilter的类中使用.

这是valgrind跟踪:

==3352== Invalid read of size 8
==3352==    at 0x804CC8F: BOViL::math::Matrix<double>::operator*(BOViL::math::Matrix<double> const&) const (Matrix.h:285)
==3352==    by 0x8051F91: BOViL::algorithms::ExtendedKalmanFilter::forecastStep(double) (ExtendedKalmanFilter.cpp:48)
==3352==    by 0x8051F25: BOViL::algorithms::ExtendedKalmanFilter::stepEKF(BOViL::math::Matrix<double> const&, double) (ExtendedKalmanFilter.cpp:39)
==3352==    by 0x804B98F: testSegmentation() (TestSegmentation.cpp:53)
==3352==    by 0x805266D: main (main.cpp:16)
==3352==  Address 0x6a8b3c0 is 0 bytes after a block of size 48 alloc'd
==3352==    at 0x402B454: operator new[](unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==3352==    by 0x804C986: BOViL::math::Matrix<double>::operator=(BOViL::math::Matrix<double> const&) (Matrix.h:224)
==3352==    by 0x8051C62: BOViL::algorithms::ExtendedKalmanFilter::setUpEKF(BOViL::math::Matrix<double>, BOViL::math::Matrix<double>, BOViL::math::Matrix<double>) (ExtendedKalmanFilter.cpp:23)
==3352==    by 0x804B74F: testSegmentation() (TestSegmentation.cpp:37)
==3352==    by 0x805266D: main …
Run Code Online (Sandbox Code Playgroud)

c++ valgrind memory-leaks

4
推荐指数
2
解决办法
2万
查看次数