ファイル JNIChaarCode.cpp


#include <stdio.h>
#include <stdlib.h>
#include "jni_JNICharCode.h"

JNIEXPORT void JNICALL Java_jni_JNICharCode_printStringAtNative
(JNIEnv *pEnv, jobject jobj, jstring jStr)
{
FILE *fp;
fp = fopen("output.txt", "a");
const jchar* jChar = pEnv->GetStringChars(jStr, NULL);
fprintf(fp, "%s\n", jChar);
fclose(fp);
}



コンパイルシェル


#!/bin/sh

gcc -I/usr/java/jdk1.5.0_06/include -I/usr/java/jdk1.5.0_06/include/linux -c JNICharCode.cpp
gcc -lstdc++ -shared -o libjnicharcode.so JNICharCode.o



クラス jni.JNICharCode


package jni;

import java.io.*;
import java.util.ArrayList;

/**
* ネイティブで文字列を中国語文字列を表示する。
*/
public class JNICharCode {
static {
System.loadLibrary("jnicharcode");
}

public static void main(String[] args) {
JNICharCode jnicd = new JNICharCode();
String[] s = jnicd.read("test.txt");
jnicd.write("test_copy.tdf", s);
jnicd.printString(s);
}

JNICharCode() {
}

/**
* JavaとCの両方で文字を出力する
*/
private void printString(String[] s) {
try {
String utf16 = new String(s[0].getBytes(), "UTF16");
String utf8 = new String(s[0].getBytes(), "UTF8");
String eucjp = new String(s[0].getBytes(), "EUC-JP");
String sjis = new String(s[0].getBytes(), "SJIS");
String siftjis = new String(s[0].getBytes(), "Shift-JIS");
String utf16be = new String(s[0].getBytes(), "UTF-16BE");
String euc_cn = new String(s[0].getBytes(), "EUC-CN");
String gb = new String(s[0].getBytes(), "GB2312");
String ms = new String(s[0].getBytes(), "MS932");

System.out.println(s[0].equals(utf16));
System.out.println(s[0].equals(utf8));
System.out.println(s[0].equals(eucjp));
System.out.println(s[0].equals(sjis));
System.out.println(s[0].equals(siftjis));
System.out.println(s[0].equals(utf16be));
System.out.println(s[0].equals(euc_cn));
System.out.println(s[0].equals(gb));
System.out.println(s[0].equals(ms));

System.out.println(s[0]);
System.out.println(utf16);
System.out.println(utf8);
System.out.println(eucjp);
System.out.println(sjis);
System.out.println(siftjis);
System.out.println(utf16be);
System.out.println(euc_cn);
System.out.println(gb);
System.out.println(ms);

printStringAtNative(s[0]);
printStringAtNative(utf16);
printStringAtNative(utf8);
printStringAtNative(eucjp);
printStringAtNative(sjis);
printStringAtNative(siftjis);
printStringAtNative(utf16be);
printStringAtNative(euc_cn);
printStringAtNative(gb);
printStringAtNative(ms);

} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}

/**
* 文字を渡します
*/
private native void printStringAtNative(String s);

/**
* 中国語ファイルを読み込む
*/
private String[] read(String filename) {
FileInputStream fis = null;
InputStreamReader isr = null;
ArrayList al = new ArrayList();

try {
fis = new FileInputStream(filename);
isr = new InputStreamReader(fis, "GB2312");

int ch = 0;
StringBuffer sb = new StringBuffer();
while ((ch = isr.read()) != -1) {
if (ch == '\n') {
al.add(sb.toString());
sb = new StringBuffer();
} else if (ch == '\r') {
// nothinig to do
} else {
sb.append((char) ch);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (isr != null)
try {
isr.close();
} catch (IOException e1) {
e1.printStackTrace();
}
if (fis != null)
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return (String[]) al.toArray(new String[0]);
}

/**
* 中国語ファイルを書き込む
*/
private void write(String filename, String[] s) {
FileOutputStream fos = null;
OutputStreamWriter osw = null;

try {
fos = new FileOutputStream(filename);
osw = new OutputStreamWriter(fos, "GB2312");

for (int i = 0; i < s.length; i++) {
osw.write(s[i] + "\r\n");
}
osw.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (osw != null)
try {
osw.close();
} catch (IOException e) {
e.printStackTrace();
}
if (fos != null)
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

おはようございます。


今日起きたら晩秋、または初冬を思わせる寒さであったので

思わず「ブログを更新しよう!」と思いました^^


今年の夏もあっという間にすぎ、

ちょこっとの秋を経て

もう冬に指しかかろうとしていま、、、せんね。。

まだまだ秋です。



晴れていれば、とても気持ちの良い季節なのですが、

曇っていると肌寒い。。(((-_-)))


皆様、お体には気をつけて過ごしましょ~。

寝るときは毛布にくるまり、ヌクヌクしてスヤスヤお眠りくださいませ。

みなさん、おひさしぶりです m(_ _)m

ひさびさの更新となります。



1ヶ月ぶりの更新ですね・・・

月日がたつのは早いですな。


1ヶ月の間、いろいろあったようななかったような。

気がついたら、もう秋の気配がただよう季節になりました。

朝がすずしくて気持ちよいです^^



今日は、朝からお買い物。

目的は、CMがバンバン流れている

「ファンタシースターユニバース」(PC版)を買うこと♪


新宿をふらふらさまよい、

「ヨドバシ」→「ビックカメラ」→「さくらや」とまわり

さくらやでゲット!!

日はすっかり高くなり、外は灼熱 (--;)

ま、みつかってよかったです♪



オンラインの対戦まえに、オフラインで操作を覚え、

いまブログを書いております。


オンラインは、なんだかメンテナンス中だそうで。。。

やはり、実際に人がつなげてみてわかる不具合っていっぱいありますよね。。。

PSUの方々、無理をしすぎない程度に運営がんばってくださいまし。

いまは、ベストよりベターな解決でのりきりましょ~♪


突然画像のみの更新失礼しますm(_ _)m



mp3plugin

おひさしぶりのブログ更新です。


最近は残業が多くてちょっとおつかれぎみの私ですが。。。


今日はVC++のエラーについて、1つ書き込みをいたします。

VC++にリソースファイル(*.rc)を追加した時、

下記のエラーが出た場合の対処を書きます。


[エラー]

fatal error RC1004: unexpected end of file found


[対処]

リソースファイル、または、リソースファイルの定数定義のヘッダファイルが

改行で終わっていないときに表示されます。

改行を入れてコンパイルしてみましょう。


私、エラーの意味がわからず、30分ほどプログラムを見直したりしてました(T_T)

「改行がなかった」だなんて・・・モゥ~~~!



今日はここまでデス。

でわでわ~( ̄▽ ̄)/

サーバの負荷状態を確かめるコマンドに

vmstatというコマンドがあります。


manは このページ を参照してください。


今日は、vmstatの簡単な見方をメモしておきます。


1.bやwの数字が大きいと、プロセスの待ち時間が長いということになります。

 各プロセスが処理しきれていない、ということ。

 余計なプロセスが動いていないか確認しませう。


2.siやsoの数字が大きいと、スワップが頻繁に発生していることになります。

 これでfreeに表示されるメモリが少なかったりすると、完全にメモリ不足で

 処理がいっぱいいっぱいということになります。

 メモリを増やすなどの処置が必要かもしれません。


3.idの時間が小さいと、CPUがフル稼働のような状態ということをあらわします。

 CPUが処理しきれないほど処理がたまっているので、

 CPUに余裕ができるように、不必要なプロセスをとめたりして、CPUに余裕をもたせるように

 したほうが良いです。



ふ~~、ざ~っと書いてきましたが、

サーバにより症状はさまざまです^^

いろんなサイトを参考に、サーバにあった対処方法を探しましょう♪

(無責任なようですみません (^^;) まだ私も詳しい見方を知らないもので)



今日はここまで。

でわでわ( ̄▽ ̄)/

いつでもどこでも、プログラムを書いているとき、

「あっ、さっき修正したとこって、

修正する前ど~なってたっけ???」

と思うことがしばしばあります。



また、ただつらつらとローカルで作業していると、

いま何やっていたかもわからなくなります。

(私、物忘れはげしいので --;)



こんな人には、やっぱりCVSがオススメ。

これがあると、ソースの改変履歴がみれますし、

改変履歴にたいして、なんでそ~ゆ~ふ~にしたのか

コメントも残すことができます。



個人でしか触らないソースに対してもコメントを残しておくと

あとあと役に立つことも少なくありません。



と良いことずくめのCVS。windows上では、cygwinで

CVSサーバをたてることができます。

ただ、CVSのソースをすこ~し手動で変更しないと

うごきませんでしたが、が、が。。。


基本的に以下のサイトのとおりにやりませう。(><)

http://eclipsewiki.net/eclipse/?Cygwin%A4%C7CVS%A5%B5%A1%BC%A5%D0%A1%BC%A4%F2%CE%A9%A4%C6%A4%EB


もし動かないときは、上記サイトの下のほうにあるこの↓コメントが正解。

  • 上のはだめでした。かわりに問題のstrcat二行を if(strcmp(dir,".")!=0) で囲ったら今のところうまく動いてます。 -- aqua? 2006-04-08 07:39:01 (土)

  • みんなも Let's CVS. Start CVS!


    今日はここまで。

    ではでは(゜ω゜)/

    FileLock.lockは、ファイルのロック権限を取得するメソッドです。


    このFileLock.lockメソッド、

    ロック権限が取得できない場合、

    ロック権限が取得できるまで、

    ずっと待ちの状態になります。


    もし、なんらかの理由で、ファイルのロック権限が

    残ってしまった場合のことを考えてみます。

    もひとつ、FileLock.lockを使用するメソッドでsynchronizedを使っているとします。


    あるスレッドAから、FileLock.lockを使用するメソッドを

    呼び出したときに、そのスレッドはFileLock.lockで待ちの状態になります。

    別のスレッドBから、FileLock.lockを使用するメソッドを

    呼び出すと、synchronizedで待ちの状態になります(スレッドAがsynchronizedの権利をもっているから)。

    で、多くのスレッドから呼ばれると、処理がずんずんたまり、

    OutOfMemoryが起こったりします。

    こういう状態を巷では、「ささる」というらしいです!(-ω-)



    こういうことが起こることが予想される場合は、

    FileLock.lockではなく、FileLock.tryLockを使いましょう~


    tryLockをfor文でまわして、何度かやっても取れなければ

    ファイルロックできなかったときの処理(エラーにするとか・・・

    どうするかはアナタ次第..(><))を書けばOKです。



    今日はここまで。
    でわでわ( ̄▽ ̄)/



    おばんどす(。・ω・)ノ


    きょうは週末なので変なテンションでおおくりします♪



    私、普段はJavaというプログラム言語を使用して

    プログラムを書いています、ハイヽ(´・ω・)ノ


    しかし、最近JNIをやる機会が多く、

    C言語もちょっぴり触るようになりました。



    昔々(といってもそんなに昔ではない)、ぜんぜん、

    さっぱり、ぽえ~んだったC言語なのですが、

    Javaをある程度やってから見ると、


    「ハハ~ン(ΦωΦ)」


    といえるようになっていたり。不思議デス。



    で、なにがいいたいの?(*゜д゜)



    といいますと、いま、何のプログラムをやろうか迷っている人へ。

    なんの言語でもよいぞ~といいたい。

    ただ、その言語を中途半端にやるのではなく、深いところまでやんなさい、と。



    いろいろな言語を広く浅くしっているよりも、1つを深くしっておいたほうが良い。

    なぜなら、1つを知っていたら、ほかの言語になったときも、

    だいたい似たような処理になるから。ホントニ!


    中途半端はよくないよ!

    やりたいことがやれないよ(これ大事)