在玩这个谜题(这是一个Java关键字琐事游戏)时,我遇到了native关键字.
Java中的native关键字用于什么?
与JNI相比,JNA似乎更容易调用本机代码.在什么情况下你会使用JNI而不是JNA?
我看到这个本机崩溃与以下堆栈跟踪.
这仅在Android 7.0和7.1中发生.该应用程序没有添加任何新内容,该应用程序已投入生产几年,但随着更多设备更新到Nougat,此崩溃现在经常发生并且正在变得令人讨厌.
任何意见,将不胜感激.
native: pc 000000000007a6c4 /system/lib64/libc.so (tgkill+8)
native: pc 0000000000077920 /system/lib64/libc.so (pthread_kill+64)
native: pc 000000000002538c /system/lib64/libc.so (raise+24)
native: pc 000000000001d24c /system/lib64/libc.so (abort+52)
native: pc 000000000001225c /system/lib64/libcutils.so (__android_log_assert+224)
native: pc 00000000000610e0 /system/lib64/libhwui.so
native: pc 000000000003908c /system/lib64/libhwui.so
native: pc 000000000003609c /system/lib64/libhwui.so
native: pc 000000000003b4fc /system/lib64/libhwui.so
native: pc 000000000003c520 /system/lib64/libhwui.so
native: pc 000000000003e694 /system/lib64/libhwui.so (_ZN7android10uirenderer12renderthread12RenderThread10threadLoopEv+152)
native: pc 00000000000127f0 /system/lib64/libutils.so (_ZN7android6Thread11_threadLoopEPv+336)
native: pc 00000000000a50b0 /system/lib64/libandroid_runtime.so (_ZN7android14AndroidRuntime15javaThreadShellEPv+116)
native: pc 00000000000770f4 /system/lib64/libc.so (_ZL15__pthread_startPv+204)
native: pc 000000000001e7d0 /system/lib64/libc.so (__start_thread+16)
Run Code Online (Sandbox Code Playgroud)
更新7月18日:
仍然无法找到这个的根,所以我决定购买一个出现次数最多且价格合理的设备,结果是三星Galaxy J3 2017版本与Android 7.0.但不幸的是仍然无法重现崩溃. …
在xcode上构建反应原生的iOS应用程序时出现此错误.
在npm install和rpm链接react-native-fs库之后开始出现此错误.但在网上搜索解决方案之后,我注意到许多人在安装其他反应本机库时遇到了同样的错误.
一个可能的解决方案,许多建议是,添加在"生成设置"下面- >"头搜索路径".
$(SRCROOT)/../node_modules/react-native/React - (递归)
但是这个解决方案没有运气,仍然得到同样的错误
是否有任何免费的本机Windows DLL导出函数查看器,它显示函数名称及其参数列表?
我很惊讶在Java源代码中看到System.arraycopy是一个本机方法.
当然原因是因为它更快.但是什么原生技巧是能够使用的代码使其更快?
为什么不循环遍历原始数组并将每个指针复制到新数组 - 当然这不是那么缓慢和麻烦?
我认为我对将.NET字节码编译为本机代码感到困惑,或者我对最终结果感到困惑.因此,当我试图理解我认为理解的东西时,请耐心等待,这样你就可以帮我找出我所缺少的东西.
我想要做的是将我用C#编写的应用程序编译成普通的本机代码,就像我用C语言编写的那样.我的推理与性能无关,而是有一定程度的保护.我明白我的最终目标并非不可能(甚至真的那么难)规避,但我只是觉得逆转x86汇编比反转Reflector给我的更难.
现在,如果我把我的C#应用程序扔进Reflector,我基本上得到了我的源代码.通常,当我将非托管C/C++应用程序放入IDAPro并使用HexRays反编译器时,我不能完全获得相同程度的反编译,我不得不求助于通过x86反汇编来理解逻辑流程.我的理解是,由于应用程序位于MSIL而不是HexRays尝试反编译的更简洁的本机代码,因此这种出色的反编译来自Reflector.
我不担心客户端机器仍然需要.NET运行时,我不是想绕过任何一个.我想upx在我的程序上运行正常的软件混淆程序,并且以.NET二进制文件的形式运行失败.
根据这个相关问题我的理解是ngen做我想要的.我试过用了ngen.但是在将输出文件从C:\Windows\assemblies\...\applicationName.ni.exe目录复制到某个地方后我可以双击,并且尝试运行它会产生错误,因为它不是"有效的Win32应用程序".此外,当我applicationName.ni.exe扔进Reflector时,我得到的输出与我的输出相同applicationName.exe.因为applicationName.ni.exe应该是本机代码,我希望Reflector出错,但事实并非如此.如果按照我应该这样做的方式,为什么Reflector仍然给我这么好的反编译?
所以,再次总结一下我的主要问题:如何将我的.NET程序编译成一个原生二进制文件,Reflector不会那么容易反编译?或者,从新手反向工程师那里保护用.NET语言编写的产品的最佳实践是什么?
如果我需要一个不同的工具,我更喜欢免费的东西而不是像Codewall这样的东西.
谢谢!
更新:我明白我正在寻找的可能会限制像Reflection这样的语言的某些功能,但我认为我很好.我的代码都没有进行任何显式Assembly.Load调用或任何类型的调用.但GetProcAddress/LoadLibrary不管怎么说,那些只是被电话取代了吗?