Coins Java - Experiment09

プリミティブ配列を作成する

[Coins Java - Experiment]

目的

作業

./libjava/primes.ccの関数に_Jv_NewArrayというものがある。これを使用してプリミティブ配列を作成してみる。

まずは、CNIを呼び出すクラスを作成する

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

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

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

配列へのアクセスによる検証は前回のものを流用して、配列の生成の部分を_Jv_NewArrayを使用して作成する

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

#include "Start.h"

/* from ./libjava/prims.cc */
extern "C" void *_Jv_NewArray(int atype, int size);

extern "C" void *createIntArray(void);
extern "C" void arrayAccess(void *);

void Start::nativeMethod (){
  jintArray array = (jintArray) createIntArray();

  elements(array)[0] = 100;
  elements(array)[1] = 200;
  elements(array)[2] = 300;
  elements(array)[3] = 400;
  elements(array)[4] = 500;

  printf("CNI : array.hashCode() = %d\n", array->hashCode());
  arrayAccess(array);
}

void *createIntArray(void) {
  /* A_TYPE : int = 10 */
  return _Jv_NewArray(10, 5);
}

void arrayAccess(void *array) {
  printf("%08x : Pointer to VTable?\n", ((long *)array)[0]);
  printf("length = %d\n", ((long *)array)[1]);
  printf("array[0] = %d\n", ((long *)array)[2]);
  printf("array[1] = %d\n", ((long *)array)[3]);
  printf("array[2] = %d\n", ((long *)array)[4]);
  printf("array[3] = %d\n", ((long *)array)[5]);
  printf("array[4] = %d\n", ((long *)array)[6]);

  long *vtable = *(long **)array;
  void *hashcode = (void *)vtable[3];
  printf("VTABLE : array.hashCode() = %d\n", ((long (*)(void *))hashcode)(array));
}
---
$ gcc -c natStart.cc

コンパイル

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

結果

以下のようになった。

$ ./a.out
CNI : array.hashCode() = 156407008
0097dbb8 : Pointer to VTable?
length = 5
array[0] = 100
array[1] = 200
array[2] = 300
array[3] = 400
array[4] = 500
VTABLE : array.hashCode() = 156407008

整数型の配列として動作し、さらに、VTableも持っていることが確認できる。

Copyright (C) 2002-2006 s.arakawa