harmony-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Tingpeng Wu" <wutingp...@gmail.com>
Subject Re: problem about System.loadLibrary and object's address
Date Sun, 29 Apr 2007 08:33:33 GMT
Hi, xiaofeng,

1. I also feel very unnatural to call it through MyRuntime class, but I don't know how to
call it directly. Since drlvm needs HotSpot to help it to compile the java source code, if
I don't call it though an instance, the HotSpot couldn't distinguish it. If I let the Jit
to add the free() call in a future time, I will not need it any more.

2. I added an method named "unsigned int get_object_addr(jobject jobj)" in object_handle.cpp
to return the address of jobj . I can call it directly to get the object address in free()
method. Since I could not assure whether it can get the right address, so I add the get_obj_addr()
for test purpose. I will delete it if it can work corredtly. 

3. Another quesetion: where is runtime helper you speak of? I am afraid I need do some investigation
on it.

Thanks,
tingpeng 
----- Original Message ----- 
From: "Xiao-Feng Li" <xiaofeng.li@gmail.com>
To: <dev@harmony.apache.org>
Sent: Sunday, April 29, 2007 4:05 PM
Subject: Re: problem about System.loadLibrary and object's address


> Tingpeng,
> 
> 1. Your native is static native, why do you call it through an instance?
> 2. You probably need to use runtime helper for the object direct free
> in Java app, because the default JNI call path will save the object
> handle (and passes the reference address as a root entry during GC
> enumeration). For your purpose, there is no GC happening in free(),
> so it probably works with a stale object reference (freed) in the
> object handle.
> 3. You can use free() directly to retrieve its object address from the
> handle. Why do you need the get_obj_addr() method?
> 
> Thanks,
> xiaofeng
> 
> On 4/29/07, Tingpeng Wu <wutingpeng@gmail.com> wrote:
>> Thanks, xiaofeng,
>> My test program is simple as follows:
>>
>> public class JNItest
>>
>> {
>>
>> static
>>
>> {
>>
>> System.loadLibrary("goodluck");
>>
>> }
>>
>>
>>
>> public native static int get();
>>
>> public native static void set(int i);
>>
>>
>>
>> public static void main(String[] args)
>>
>> {
>>
>> JNItest test = new JNItest();
>>
>> test.set(10);
>>
>> System.out.println(test.get());
>>
>> }
>>
>> }
>>
>> Then I use javah to produce JNItest.h and implement two method in JNItest.cpp. Then
use them to build goodluck.dll. I use the latest verson of drlvm to test it, there is still
an error which reports "Vm launcher meets error and needs shut up (this is translated from
chinese)".
>>
>> The reason I asked the second problem is I want to get the address of obj in java
to support the reclaimation. I plan to
>> MyRuntime class, which has a native method,
>> My thought now is as follows:
>> 1. provide a new class named MyRuntime which has two native methods.
>>     class MyRuntime
>>     {
>>          static
>>          {
>>               System.loadLibrary("runtime");
>>          }
>>
>>         //public native static void alloc(……);
>>
>>          public native static void get_obj_addr(Object obj);
>>
>>           //public native static void free(Object obj);
>>     }
>>
>> 2.    export the get_object_addr(jobject jobj) in vmcore to support MyRuntime.get_obj_addr(Object
obj)
>> 3.    export the free(unsigned size, void* address) in gc to support MyRuntime.free(Object
obj)
>> 4.    if above is right, I can call MyRuntime.free(obj) in java method.
>>
>>
>>
>> Is it feasible to get address that way to support the reclaimation method?
>>
>> Thanks,
>> tingpeng
>>
>> ----- Original Message -----
>> From: "Xiao-Feng Li" <xiaofeng.li@gmail.com>
>> To: <dev@harmony.apache.org>
>> Sent: Sunday, April 29, 2007 11:06 AM
>> Subject: Re: problem about System.loadLibrary and object's address
>>
>>
>> > Tingpeng, can you post your program if there is no legal issue? (e.g.,
>> > open a JIRA issue and attach your code there).
>> >
>> > For your second question, itis pretty the core part of JVM native
>> > interface design. Yes, the handle is used to access Java object
>> > indirectly. The idea is to support object movement during GC, then the
>> > real new address of the same object can be stored to the handle. It's
>> > not supposed to be used everywhere in the JVM, because that may break
>> > the protocol of JNI, causing GC to fail to update the object new
>> > address, e.g., if it is put into a register by your C compiler. You
>> > can access it in two ways: either always use JNI interface, or
>> > guarantee there is GC happening when you access it.
>> >
>> > Thanks,
>> > xiaofeng
>> >
>> > On 4/29/07, 吴廷鹏 <wutingpeng@gmail.com> wrote:
>> >> Hi, all,
>> >> when I use drlvm to execute my program, I found that when program has System.loadLibrary
call, there is always an error which reports "java.lang.outofmemoryerror <no stack trace
available>". The same program can run on Hotspot. Why this happens and how to solve it?
>> >>
>> >> Another question, I read the implementation code of Object.clone method
in Object_generic.cpp.
>> >>
>> >> jobject object_clone(JNIEnv *jenv, jobject jobj)
>> >> {
>> >>     ObjectHandle h = (ObjectHandle) jobj;
>> >>
>> >>     //aquire the target address and assign it to variable named result
>> >>
>> >>     memcpy(result, h->object, size);
>> >>
>> >> }
>> >> According to my comprehension, h->object is the address of java object.
Is it ture? Does this means I can use the same way to get the address of object in vmcore's
other place provided the necessary head file is included?
>> >>
>> >> Thanks,
>> >> tingpeng
>> >>
>> >
>> >
>> > --
>> > http://xiao-feng.blogspot.com
>> >
> 
> 
> -- 
> http://xiao-feng.blogspot.com
>
Mime
View raw message