在深入研究JRE库的源代码之后,我注意到一个奇怪的常见代码结构,如下所示:
public int foo(double bar) {
return foo0(bar);
}
private native int foo0(double bar);
Run Code Online (Sandbox Code Playgroud)
这个代码模式的目的是什么,为什么使用它而不是简单地将底层本机方法公开为公共方法?
我正在尝试调用本机机器语言代码.这是我到目前为止(它得到一个总线错误):
char prog[] = {'\xc3'}; // x86 ret instruction
int main()
{
typedef double (*dfunc)();
dfunc d = (dfunc)(&prog[0]);
(*d)();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它确实正确地调用了函数并且它到达了ret指令.但是当它试图执行ret指令时,它有一个SIGBUS错误.是因为我在一个未清除执行的页面上执行代码或类似的东西?
那么我在这里做错了什么?
我对JNI非常熟悉,我很想看到java.lang包中某些本机方法的机器特定实现.Thread#currentThread(), 例如.
我在[JDK_HOME]/jre/bin中找到了一堆DLL,但就像我说的那样,我试图找到源代码.
有谁知道可以找到原生源代码的位置?它是否可用,或者它是否被Sun分类(oops我的意思是"我们在其中赢得它"Oracle)?
例如,在查看GlowCode分析器网站时,它说:
"GlowCode 6.2和x64配置文件本机,托管和混合C++,C#,.NET代码"
他们的意思是什么?
如果没有将UIWebView作为我的nib文件中最后面的图层,我怎样才能将重复的背景图像添加到iPhone应用程序(如分组UITableView背景中的灯芯绒外观)?
我是否需要创建一个与iPhone屏幕大小相同的图像并使用复制和粘贴手动重复它?
是否有用于JavaScript的本机机器代码编译器?我不是在谈论VM.如果它不存在可以做到吗?
我想知道它是否可以编译为二进制,因为语言的动态性质.
我的Android应用程序(使用本机库)在Android 4.4上打印此警告:
链接器mylib.so具有文本重定位.这会浪费内存并且存在安全风险.请修理.
你知道它是什么以及如何解决它吗?谢谢,
是否可以获取并观察Android的程序组件的本机方法代码.如果有人知道怎么做,请告诉我.
除了标准+,-,*和/运营商; 但什么是这些均值(**,^,%,//)?
>>> 9+float(2) # addition
11.0
>>> 9-float(2) # subtraction
7.0
>>> 9*float(2) # multiplication
18.0
>>> 9/float(2) # division
4.5
>>>
>>> 9**float(2) # This looks like a square, (i.e. power 2)
81.0
>>> 9**float(3) # So ** is equivalent to `math.pow(x,p)` ?
729.0
Run Code Online (Sandbox Code Playgroud)
又如何^操作?
>>> 9^int(2) # What is `^` in `x^u` , it only allows `int` for `u` …Run Code Online (Sandbox Code Playgroud) 对于我的10,000点,我决定用这个很酷的网站来点缀一些东西:一种在本机内存上缓存位图的机制.
Android设备的每个应用程序的内存量非常有限 - 堆的范围从16MB到128MB,具体取决于各种参数.
如果您通过此限制,则会获得OOM,当您使用位图时,这可能会发生多次.
很多时候,应用程序可能需要克服这些限制,对巨大的位图执行繁重的操作,或者只是存储它们以供以后使用,并且您需要
我想出的是一个简单的java类,它可以使事情变得更容易.
它使用JNI来存储位图数据,并能够在需要时恢复它.
为了支持该类的多个实例,我必须使用我发现的技巧(这里).
数据仍然存储在RAM中,因此如果设备没有足够的RAM,应用程序可能会被杀死.
记得尽快释放记忆.它不仅可以避免内存泄漏,而且还可以避免在您的应用程序到达后台时首先被系统优先处理.
如果您不想忘记释放内存,可以在每次还原位图时释放它,或者使类实现Closable.
作为一种安全措施,我已经使它在finalize()方法中自动释放其本机内存,但不要让它负责这项工作.风险太大了.当这样的事情发生时,我也写了它写入日志.
它的工作方式是将整个数据复制到JNI对象中,为了还原,它从头开始创建位图并将数据放入其中.
正在使用和恢复的位图采用ARGB_8888格式.当然,您可以将其更改为您想要的任何内容,只是不要忘记更改代码...
大位图可能需要一些时间来存储和恢复,因此在后台线程上执行它可能是明智的.
这不是一个完整的OOM解决方案,但它可能有所帮助.例如,您可以将它与您自己的LruCache结合使用,同时避免将堆内存用于缓存本身.
代码仅用于存储和恢复.如果您需要执行某些操作,则需要进行一些研究.openCV可能就是答案,但是如果你想要执行一些基本的东西,你可以自己实现它们(这里是使用JNI旋转大图像的例子).如果你知道其他选择,请在这里告诉我.
希望这对某些人有用.请写下你的意见.
此外,如果您发现代码有任何问题或建议填补,请告知我们.
如果您希望在JNI端执行更多操作,您可以使用我所做的这篇文章.它基于我在这里编写的代码,但允许您进行更多操作,您可以轻松添加更多自己的代码.
native ×10
android ×3
java ×2
bitmap ×1
c ×1
c++ ×1
caching ×1
cocoa-touch ×1
compilation ×1
iphone ×1
javascript ×1
linux ×1
managed ×1
math ×1
native-code ×1
operators ×1
python ×1
repeat ×1