13

JNI 関数を使用して Java クラスを作成し、DeviceId.java コンストラクター メソッドを使用してそのクラスのいくつかのプロパティを設定しようとしています。GetMethodID を使用してコンストラクター メソッドを取得することはできますが、Device.java の新しいインスタンスを作成してから、プロパティ (setId および setCache) を設定するにはどうすればよいでしょうか。目標は、完全に設定された Device.java オブジェクトのインスタンスを呼び出し元に返すことです。何か案は?

JNI 関数:

 JNIEXPORT jobject JNICALL Java_com_test_getID(JNIEnv *env, jclass cls) 
    {
        jmethodID cnstrctr;
        jclass c = (*env)->FindClass(env, "com/test/DeviceId");
        if (c == 0) {
            printf("Find Class Failed.\n");
         }else{
            printf("Found class.\n");
         }

        cnstrctr = (*env)->GetMethodID(env, c, "<init>", "(Ljava/lang/String;[B)V");
        if (cnstrctr == 0) {
            printf("Find method Failed.\n");
        }else {
            printf("Found method.\n");
        }

        return (*env)->NewObject(env, c, cnstrctr);
    }

Java クラス:

package com.test;

public class DeviceId {
    private String id;
    private byte[] cache;

        public DeviceId(){}
    public DeviceId(String id, byte[] cache){
        this.id=id;
        this.cache=cache;
    }

    public byte[] getCache() {
        return cache;
    }

    public void setCache(byte[] cache) {
        this.cache = cache;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }   
}
4

2 に答える 2

10

を呼び出したときにGetMethodID、引数が 2 つのコンストラクターの署名を指定しました。したがって、呼び出すときにyourjstringと aを渡すだけです。たとえば、次のようになります。jbytearrayNewObject

return (*env)->NewObject(env, c, cnstrctr, id, cache);

引数 0 のコンストラクターを呼び出すことにしない限り、 setIdandメソッドを呼び出す必要はありません。また、それらを呼び出して呼び出す必要があるため、コードが複雑になります。進行中のルートを簡単に続行できます。setCacheGetMethodID

于 2012-04-12T20:05:54.407 に答える