我正在进行的项目要求我编写跨平台程序实现的android部分.
构建了一组核心功能,并将其包含在我的应用程序中android-ndk.我发现在本机代码中发生的任何异常/崩溃只会在现在和最后再次报告.发生错误时,我会收到以下行为之一:
NullPointerException(通常在每个本机代码异常的相同位置,这是一个巨大的痛苦).通常会让我花费一段时间来尝试调试为什么Java代码抛出错误只是为了发现Java代码很好并且本机代码错误已被完全掩盖.我似乎无法找到任何方法来"隔离"我的代码以防止在本机代码中发生的错误.Try/catch语句被彻底忽略了.除了我的代码被指责为罪魁祸首之外,我甚至没有机会警告用户而不是发生错误.
有人可以帮我解决如何应对崩溃本机代码的情况吗?
java-native-interface android exception-handling nullpointerexception android-ndk
我正在检查一些崩溃,所有崩溃都有SIGSEGV信号,原因是SEGV_ACCERR.在搜索SEGV_ACCERR之后,我发现最接近人类可读解释的是:对象的无效权限
这在更一般意义上意味着什么?何时出现SEGV_ACCERR?关于这个原因有更具体的文件吗?
我在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) 我知道我可以简单地从迭代start到end和清除这些细胞,但我想知道,如果它(可能使用JNI-ED是任何更快的方式可能System.arrayCopy)?
我正在尝试使用本机库来修改字节数组(实际上是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) 我疯狂地理解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) android ×3
c++ ×3
android-ndk ×1
arraycopy ×1
c ×1
c# ×1
java ×1
memory-leaks ×1
native ×1
objective-c ×1
performance ×1
signals ×1
valgrind ×1