Path: csiph.com!usenet.pasdenom.info!aioe.org!eternal-september.org!feeder.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Steven Simpson Newsgroups: comp.lang.java.programmer Subject: Re: JNI and GetFieldID Date: Fri, 06 Sep 2013 22:34:32 +0300 Organization: A noiseless patient Spider Lines: 53 Message-ID: <8bnpfa-417.ln1@s.simpson148.btinternet.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Injection-Info: mx05.eternal-september.org; posting-host="567aef81bfffdf4c0a37048ecfe0090c"; logging-data="20882"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/+rKJPpPSWXTWWQ3o29PXLfgguyoiDA6U=" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130804 Thunderbird/17.0.8 In-Reply-To: Cancel-Lock: sha1:8D1f40cYTz2f8NhvhpAkb2t9xqc= Xref: csiph.com comp.lang.java.programmer:25236 On 06/09/13 21:44, Borneq wrote: > public interface ICallback { > void OnPercent(int percent); > void OnPercentEx(CmplxStruct cs); > } While in Java, you should use Java conventions, e.g. onPercent for a method name. Can't say I'm a fan of prefixing "Callback" with "I" to show it's an interface either. > public class CmplxStruct { > int fieldI; > String str; > } CmplxStruct? Ky, 'll tk tht s jst n ex. > How place number and string? > jmethodID mid; > mid = env->GetMethodID(cls, "OnPercentEx", "(LCmplxStruct;)V"); > env->CallVoidMethod(param1, mid, SOMETHING); > how fill SOMETHING? Never learned to do that - looks too error-prone. Instead of mucking around in JNI, creating objects, accessing fields, etc, I prefer to do as much as I can in Java, then declare the native methods as taking the already dismantled fields as separate arguments. You could do similar for a callback. Write a private static method to do the fiddly stuff: private static void callBack(ICallback dest, int i, String s) { CmplxStruct obj = new CmplxStruct(); obj.fieldI = i; obj.str = s; dest.OnPercentEx(obj); } Now, in JNI, you use something like: jobject dest = ...; jint i = ...; jstring s = ...; mid = env->GetStaticMethodID(cls, "callBack", "(LICallback;ILjava/lang/String;)V"); env->CallStaticVoidMethod(dest, i, s); -- ss at comp dot lancs dot ac dot uk