Coins Java - Experiment12

Stringの生成

[Coins Java - Experiment]

目的

作業

"Coins-Java"という文字列をフィールドにもつクラスを作成する。

$ emacs Start.java
--- Start.java
public class Start {

    public static final String JAVA_STRING = "COINS-Java";

    public static void main(String[] args) {
        nativeMethod();
    }

    public static native void nativeMethod();
}
---
$ gcj -C Start.java
$ gcjh Start

_Jv_NewStringUTFという関数を使用して、"COINS-Java"というStringを作る。java.lang.String#internメソッドを使用するため、Start#JAVA_STRINGと同じアドレスを指すはずである。

$ emacs natStart.cc
--- natStart.cc
#include <stdio.h>

#include <java/lang/System.h>
#include <java/lang/String.h>
#include <java/io/PrintStream.h>
#include "Start.h"

#define StringIntern(str) _ZN4java4lang6String6internEv(str)

extern "C" void *_Jv_NewStringUTF(const char *);
extern "C" void *StringIntern(void *);

void Start::nativeMethod (){
  using namespace java::lang;

  void *gcjstr = ::Start::JAVA_STRING;
  void *nativestr = StringIntern(_Jv_NewStringUTF("COINS-Java"));

  System::out->println((String *)gcjstr);
  System::out->println((String *)nativestr);

  printf("%08x : gcjstr\n", gcjstr);
  printf("%08x : nativestr\n", nativestr);
}
---
gcc -c natStart.cc

コンパイル。

gcj --main=Start *.class *.o

結果

以下のようになった。

$ ./a.out
COINS-Java
COINS-Java
09e797f8 : gcjstr
09e797f8 : nativestr

同じ文字列で、同じアドレスを指すjava.lang.Strinのインスタンスを生成できた。

考察

初めはintern()メソッドを呼び出さなかったのだが、その際には

09e797f8 : gcjstr
09e797f8 : nativestr

この部分が同じアドレスを示さなかった。

また、今回は_Jv_NewStringUTFという関数を使用したが、_Jv_NewStringLatin1という関数も存在する。これはISO-8859-1で表現された文字列をStringインスタンスにするもので、今回のようにASCIIの部分しか使用しない場合は_Jv_NewStringUTFより高速だと思われる。(未検証)

Copyright (C) 2002-2006 s.arakawa