在某些程序中运行addr2line时,我会在行尾给出一个"鉴别器N"注释:
main at /tmp/nsievebits.c:56 (discriminator 3)
手册页没有提到它,快速谷歌搜索似乎主要表明源代码文件,没有明确的解释.这是一些故意无证的功能吗?更重要的是,我应该担心吗?
假设我们需要在本机代码中实现一些java方法并将其公开给用户.我们知道所有工作都是由本机完成的,即java代码的唯一责任是将用户提供的参数传递给本机代码并返回结果.据此,java层可以用两种方式实现:
通过使用直接向用户公开的本机方法:
public native Object doSmth(Object arg0, Object arg1);
Run Code Online (Sandbox Code Playgroud)通过使用私有本机方法的瘦公共包装:
public Object doSmth(Object arg0, Object arg1) {
return nativeDoSmth(arg0, arg1);
}
private native Object nativeDoSmth(Object arg0, Object arg1);
Run Code Online (Sandbox Code Playgroud)我已经在实际项目中看到了这两种方法,甚至在同一项目中也看到了前者和后者.
因此,我的问题是:所提到的任何替代方案是否具有某些技术或性能或可维护性优势,应鼓励仅使用一种变体.或许这只是一个品味问题?
假设一方面我们有一个直接字节缓冲区env->NewDirectByteBuffer().另一方面,我们有类似的直接缓冲区,但创建了ByteBuffer.allocateDirect().显然,这两个对象应该由JVM以相同的方式管理,包括后端本机缓冲区的管理,第一种情况是由用户提供,第二种情况是由JVM从本机堆分配的.
当然,JVM必须在第二个对象(实例化ByteBuffer.allocateDirect())的GC期间释放后备缓冲区.
我的问题是:JVM是否会在第一个对象(实例化env->NewDirectByteBuffer())的GC期间尝试释放缓冲区?
PS我也没有在JNI医生处找到明确的答案.最有用的信息是http://www.ibm.com/developerworks/library/j-nativememory-linux/index.html:
Direct ByteBuffer对象自动清理其本机缓冲区,但只能作为Java堆GC的一部分执行 - 因此它们不会自动响应本机堆上的压力.
所以看起来JVM会在GC传递过程中释放后备缓冲区,但是没有任何关于deallocator的提及.是明白free()还是别的什么.
众所周知,如果需要重置一个sigset_t变量就足够了
sigemptyset(&my_ss);
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一种标准的方法来初始化这样的变量以使其为空(即好像用户刚刚使用上面显示的方法重置了它)。也许某种类似于 pthread API 的宏。例如
static sigset_t trackedSignals = SIGSET_INITIALIZER;
Run Code Online (Sandbox Code Playgroud)
在 Linux 系统上{0},将其用作这样的初始化程序显然就足够了,但它可以在任何地方使用吗?因为正如我所见,POSIX 很少定义这种类型:
sigset_t
[CX] 用于表示信号集的对象的整数或结构类型。
因此,严格来说,{0}不必将此对象初始化为语义上的“空”。
有没有办法找出机器指令的地址,被某些信号打断了?假设我们在所确立的处理程序sigaction(),并拥有所有访问过siginfo_t和ucontext_t.据我所知,man page对此一无所知.
我试图弄清楚FFmpeg如何在AVFrame解码音频后将数据保存在中。
基本上,如果我在AVFrame->data[]数组中打印数据,则会得到许多无符号的8位整数,它们是原始格式的音频。
从FFmpeg doxygen可以理解,数据的格式用表示,enum AVSampleFormat并且有2个主要类别:交错和平面。在交错类型中,数据全部AVFrame->data以大小保留在数组的第一行中,AVFrame->linesize[0]而在平面类型中,音频文件的每个通道都保留在AVFrame->data数组的单独行中,并且数组的大小保留为size AVFrame->linesize[0]。
是否有指南/教程说明数组中的数字对每种格式意味着什么?
我在 Android 应用程序中使用共享对象库。这些共享对象库在.aar文件中。
图书馆之一正在崩溃。为了检查崩溃日志和确切的行号。我正在使用ndk-stack。
的用法ndk-stack是
$ adb logcat | ndk-stack -sym <Path to your shared libraries>
Run Code Online (Sandbox Code Playgroud)
现在如何在 AAR 文件中获取共享库的路径?
我正在尝试使用 NDK编译libfuse,我的环境:
Win10(64bit) + NDK(r14b,64bit) + libfuse(3.1.0)
在fuse_common.h 中发生错误,它检查以下大小off_t:
$ ndk-build
[armeabi-v7a] Compile thumb : fuse <= buffer.c
In file included from jni/../../libfuse/lib/buffer.c:15:
In file included from jni/../../libfuse/lib/fuse_i.h:9:
In file included from jni/../../libfuse/include\fuse.h:19:
jni/../../libfuse/include/fuse_common.h:745:13: error: bit-field
'_fuse_off_t_must_be_64bit' has negative width (-1)
{ unsigned _fuse_off_t_must_be_64bit:((sizeof(off_t) == 8) ? 1 : -1); };
^
1 error generated.
make: *** [obj/local/armeabi-v7a/objs/fuse/__/__/libfuse/lib/buffer.o] Error 1
Run Code Online (Sandbox Code Playgroud)
这是在fuse_common.h 中的检查:
struct _fuse_off_t_must_be_64bit_dummy_struct \
{ unsigned _fuse_off_t_must_be_64bit:((sizeof(off_t) == 8) ? 1 …Run Code Online (Sandbox Code Playgroud) 据我所知,ARM 的 Linux ABI 声明系统调用返回值是通过传递的r0,如果它是负数,它应该被线程化为 errno 值否定。即系统调用结束了一些错误。AOSP以某种奇特的方式执行此检查:
ENTRY(syscall)
mov ip, sp
stmfd sp!, {r4, r5, r6, r7}
.cfi_def_cfa_offset 16
.cfi_rel_offset r4, 0
.cfi_rel_offset r5, 4
.cfi_rel_offset r6, 8
.cfi_rel_offset r7, 12
mov r7, r0
mov r0, r1
mov r1, r2
mov r2, r3
ldmfd ip, {r3, r4, r5, r6}
swi #0
ldmfd sp!, {r4, r5, r6, r7}
.cfi_def_cfa_offset 0
cmn r0, #(MAX_ERRNO + 1) /* Set C flag if r0 is between -4095 and -1, set …Run Code Online (Sandbox Code Playgroud) 有没有办法为任意进程请求转储,这类似于为ANR生成的进程/data/anr/traces.txt?可能应该可以通过设备的shell.
提前致谢!
java代码:
public class Foo {
private long i = 0;
void printI() {
nativePrintI();
}
private native static void nativePrintI();
}
Run Code Online (Sandbox Code Playgroud)
JNI代码:
JNIEXPORT void JNICALL Java_com_aliyun_livestream_Publisher_nativeRelease
(JNIEnv *env, jobject obj) {
jclass cls = env->GetObjectClass(obj);;
jfieldID iField = env->GetFieldID(cls, "i", "J");
jlong i = env->GetLongField(obj, iField);
printf("%lld\n", i);
}
Run Code Online (Sandbox Code Playgroud)
我的被叫者是这样的:
Foo foo = new Foo();
foo.printI();
Run Code Online (Sandbox Code Playgroud)
有时它工作正常,但有时它失败了消息""jni对类java.lang.Class的对象无效"