faywong 发布的文章

在Java中经常会遇到通过外部语言扩展Java本身的需要,此时就需要使用到JNI这门技术(规范)。
在c/c++中,java层的数据类型需要转化成类型签名,如在google中被收录在最前边的[官方文档](https://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/types.html)中[Table 3-2](https://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/types.html#wp276)所示。

问题来了,那么void类型在c/c++用什么来映射呢。这份表格里边是没有的(对应java 7的[JNI规范里](http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html#wp16432)边也没有)。今天在[其他文档](http://www.rgagnon.com/javadetails/java-0286.html)里边间接查到void类型的类型签名是V:

```bash
Type Chararacter
boolean Z
byte B
char C
double D
float F
int I
long J
object L
short S
void V
array [
```
比如Java方法:
```java
public static void jsDebugDetachCallback(long udata)
```
的类型签名为(其中返回值类型V不可省略):
```java
"(J)V"
```
在c中获取该方法id的方式为:
```c
jsDebugDetachCallbackMethod = (*env)->GetStaticMethodID(env, someClz, "jsDebugDetachCallback", "(J)V");
```

最近需要使用opengrok作为webservice来提供代码交叉索引功能。

但是opengrok的release版本中还没有提供这个功能,原因在于这个提交没有被release。

所以只能自己编译最新的master分支代码并deploy。注意一点编译时需要1.8的jdk,tomcat server也需要1.8jdk来运行方能不出错。

在服务的url后边加上json?freetext=ThreadPoolExecutor之类的参数(其他参数请见我在Opengrok项目上的回复)便可查询到结果了。

针对这个问题本人贡献了一遍详细点的[文档](https://github.com/OpenGrok/OpenGrok/wiki/OpenGrok-web-services),请参阅。

最近遇到一个应用打开WebApp后,将应用压入后台,出现比较耗电的问题。集合众多同学的智慧之后定位到原因:

在WebKit的内核中会引用从各个平台(android, linux pc, mac)注入的自己的服务比如:

* DeviceOrientationService
* DeviceMotionService

而这两个Service在android平台上的实现皆通过注册侦听器到SensorManager来获知来自于加速度器,磁力计的方位、手机姿势数据。

Sensor的使用是极其浪费电力的一件事情,所以就出现了上文所述问题。

解决方法:

1) 在Activity的onPause(), onResume()时调用WebView.onPause(), WebView.onResume()以尽量将JS执行线程以及其他WebCore中的线程给停住

2) 在onStop()时将WebView中当前load的url记住,然后让WebView.loadUrl("about:blank"),在onStart()时WebView.loadUrl({your_previous_url})

更新:
[2015/11]在最近的工作中还发现一种前端页面带来的耗电问题:当页面加载一些gif或者通过其他方式创建的动画效果,当webview变得不可见后这些动画如果没有被显式关掉,就会导致很严重的耗电问题。同时在桌面浏览器里边我也注意到页面里边持续运行的动画也会导致内存占用增大。

以如下裴波那契数列为测试代码:

```javascript
function fibonacci(n)
{
if (n < 2) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
print('fibonacci(20):' + fibonacci(20));
```
当输入为10时的结果(单位:ms):

27 12-09 14:13:04.371 4816 4816 E BirdNest: fibonacci(10):55

29 12-09 14:13:04.371 4816 4816 I faywong : benchmark(v8): 537

31 12-09 14:13:04.391 4816 4816 I BirdNest: fibonacci(10):55

32 12-09 14:13:04.391 4816 4816 I faywong : benchmark(duktape): 2336

当输入为20时的结果:

59 12-09 14:15:38.621 9196 9196 E BirdNest: fibonacci(20):6765

61 12-09 14:15:38.621 9196 9196 I faywong : benchmark(v8): 1583

63 12-09 14:15:38.841 9196 9196 I BirdNest: fibonacci(20):6765

64 12-09 14:15:38.841 9196 9196 I faywong : benchmark(duktape): 189211

大致汇总下:在输入为10时,v8性能是duktape的4倍;

在输入为20时,v8性能是duktape的119倍,jsc是duktape的接近100倍

因为要与java后端协作,数据库得建成UTF-8编码的。折腾了半天,实在是没有办法,改了locale,重新安装postgresql-server,最终通过命令行指定编码和模板(这点很重要)这样蒙混过关:

命令行:

```bash
createdb --locale=en_US.utf8 --encoding=UTF8 --template=template0 test_db
```

然后确认下:

![psql_result](/uploads/2015_09_02_01.jpg)