本地网卡和WIFI网卡共存不能上网

原因是路由都走本地网卡了,这点可以用tracert命令证明。

于是,用以下三条命令可实现上网:

1
2
3
route delete 0.0.0.0
route add 0.0.0.0 mask 0.0.0.0 192.168.43.1
route add 192.168.0.0 mask 255.255.0.0 192.168.1.1

其中192.168.43.1是WIFI网关,192.168.1.1是本地网关。

MessageDialogFragmentV4 can't find android.support.v4.app

编译UVCCamera生成signed apk时,报一堆这样的错:

1
2
3
Warning:com.serenegiant.dialog.MessageDialogFragmentV4: can't find referenced method 'void show(android.support.v4.app.FragmentManager,java.lang.String)' in program class com.serenegiant.dialog.MessageDialogFragmentV4
Warning:com.serenegiant.dialog.MessageDialogFragmentV4: can't find referenced method 'void setTargetFragment(android.support.v4.app.Fragment,int)' in program class com.serenegiant.dialog.MessageDialogFragmentV4
com.serenegiant.dialog.MessageDialogFragmentV4: can't find referenced class android.support.v4.app.Fragment

解决办法,把libuvccamera和usbCameraCommon目录中的build.gradle修改一下,注释掉'support-v4':

1
2
3
compile("com.serenegiant:common:${commonLibVersion}") {
//	exclude module: 'support-v4'
}

日语学习还不明白的地方

李さんは(部長に)ほめられました。
李さんはほめられました。

陳さんは飼っていた小鳥に逃げられました。

空気読まんかい!空気を!

厳しい暮らしを強いられる

この附近は夜くすりをまいて水洗いをしますので寝ないで下さい

君は一人の人間に過ぎない
君は世界そのものだ

君のこと愛するなんて別に君は誰だっとじゃなくて

ろくに...ない
かねない
しかるべきだ
当たり前だ

いかが(如何) わらった(笑った) まなばん(学ばん)

仅か(僅か)(わずか)

にもかかわらず
あいかわらず

たった
ただ
ただしい
ただで

母亲は子供を起きさせる。
母亲は子供を起こす。
なかなか食わせる店だ

ながら
中国にいながら見れる

新た 新しい

漢の1/3を手に入れた曹操はみずからを魏王となのり、劉備たちのすむ荊州に攻めこんできた。

地元(じもと)の小学生によるお祝いの演奏会が開(ひら)かれた。
举办了由当地的小学生所组成的庆祝演奏会。

すでに友四郎との結婚を決意していた。
この新しい薬は、何年にもわたる研究のすえに作り出されたものだ。
这个新药,是经过多年研究开发后生产出来的药品。

銀行と商事会社の両方の入社試験に合格した兄は、いく日も考えた末に(あげくに)銀行を選んだ。

そろそろ安穏な生活に飽きがきていた。

経営は夫の政之の力に寄るところが大きい。
四女の耀子は独身で舞台女優の卵であり、政之の弟でテレビのディレクターをしている研一に想いを寄せている。

女であることに徹底できない安燈に研一は苛立ちを感じていた。

会社に入ったばっかりで精神的にいろんなプレッシャーがかかりがちな時期。上司に仕事を頼まれても正直できる気がしません。だから、つい「すみません、もういっぱいいっぱいで…」と断った。なんてことしたら、新入社員としてやっぱりマズいのでしょうか?

耀子には横暴としか思えない政之のために、料理を習っているという英子を見て、ある感動を覚えるのだった。

こつぶなこむぎがこいき

Linux禁止用户访问某个目录

比如root用户生成了一个文件夹dir0,再执行

1
chmod o-rwx dir0

那么当非root权限用户usr0访问此目录

1
2
cd dir0/
bash: cd: dir0/: Permission denied

Android NDK动态获取系统版本

让电脑连上安卓手机上,执行

1
2
adb shell
cat /system/build.prop

可看到

1
2
3
4
5
...
ro.build.version.sdk=18
ro.build.version.codename=REL
ro.build.version.release=4.3
...

于是jni中可写如下代码获取系统版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <sys/system_properties.h>
 
static int test(){
    char *key = (char *)"ro.build.version.sdk";
    //char *key = (char *)"ro.build.version.release";
    char value[1024] = {0};
    int ret = __system_property_get(key, value);
    if (ret <= 0 ) {
        DBG(("get prop value failed.\n"));
        return 0;
    }
    DBG(("ro.build.id is [%s]\n", value));
 
    return 0;
}

Android jni基于NdkMediaCodec硬解码mjpeg

NdkMediaCodec需要安卓5.0以上系统才能运行,在Android.mk里加入

1
LOCAL_LDLIBS += -lmediandk

如果是在安卓5.0以下系统中跑,程序会直接崩掉,主函数都不会进,所以要在旧手机中运行,要根据系统版本来判断是不是5.0以上系统,如果是则动态加载libmediandk.so,而不要写死在编译脚本里。

还有,要看手机上有没有解mjpeg的硬解码器,通过以下java代码来查看

1
2
3
4
5
6
7
8
9
10
11
12
int n = MediaCodecList.getCodecCount();
for (int i = 0; i < n; ++i) {
	MediaCodecInfo info = MediaCodecList.getCodecInfoAt(i);
	String[] supportedTypes = info.getSupportedTypes();
	boolean mime_support = false;
	if(info.isEncoder()){
		continue;
	}
	for (int j = 0; j < supportedTypes.length; ++j) {
		Log.v("euhat", "codec info:" + info.getName()+" supportedTypes:" + supportedTypes[j]);
	}
}

以下是jni硬解码代码,因为没找到支持mjpeg硬解的手机,所以还没实际跑起来过。
但实际测试过程中,新的手机上软解1920x1080的mjpeg输出yuv都很流畅了。

Read more

电子游戏历史好文推荐

电子游戏发展史之百家争鸣的1970年代
https://www.toutiao.com/i6583582769782194702/
https://www.toutiao.com/i6584374365003973128/
https://www.toutiao.com/i6585338411727454733/

NAMCO创始人中村雅哉,这篇文章里又一次提到了乔帮主
https://www.vgtime.com/topic/453341.jhtml
https://www.vgtime.com/topic/559644.jhtml

飞行射击
http://m.appgame.com/archives/376628.html

荒野大镖客此时非彼时
https://www.toutiao.com/a6611296396240749069/

任天堂当年为什么会把塞尔达放给卡普空做?
https://www.toutiao.com/a6607893750234481160/

他们做了《双截龙》和“热血”系列,并将自身的影子融入到游戏中
https://www.toutiao.com/a6633393093313823239/

这个由KONAMI辞职员工建立的公司,建立了一个新的游戏王朝
https://www.toutiao.com/i6633764479127519752/

值得关注的号
======
闯关族之家
https://www.toutiao.com/c/user/17238062515/#mid=1606759100795908
1号玩家
https://www.toutiao.com/c/user/77965025598/#mid=1585652639205389

关键词
===
岩谷彻的《吃豆人》
西角友宏的《太空侵略者》
石村繁一的《Galaxian》
远藤雅伸的《铁板阵》
《妖怪道中记》
TENGEN(天元)中岛英行
坂本贺勇的《银河战士》
“游戏音乐圣手”的细野晴臣
田尻智的《口袋妖怪》
上月景正

安卓jni毫秒级打印

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include <fcntl.h>
#include <string>
 
using namespace std;
 
void ivrLog(const char *format, ...)
{
	va_list argptr;
	char buf[1024 * 2];
 
	va_start(argptr, format);
	vsprintf(buf, format, argptr);
	va_end(argptr);
 
	struct timeval tv;
	int iRet = gettimeofday(&tv, NULL);
	time_t t = tv.tv_sec;
	tm* local = localtime(&t);
	char timeBuf[256];
	strftime(timeBuf, 254, "[%Y-%m-%d %H:%M:%S", local);
	sprintf(timeBuf + strlen(timeBuf), ":%d] ", (int)(tv.tv_usec / 1000));
	string dispStr = timeBuf;
	dispStr += buf;
 
	printf("%s", dispStr.c_str());
 
	// please ensure /sdcard/Test dir existed first
	char *logFileName = (char *)"/sdcard/Test/log.txt";
 
	int fd = open(logFileName, O_CREAT|O_WRONLY|O_APPEND, 0666);
	if (fd != -1)
	{
		write(fd, dispStr.c_str(), dispStr.length());
		close(fd);
	}
}