4

Java アプリケーションと JNI (dll) があります。JNI にパラメーターとして渡される列挙型 (int) の値を取得する方法を知りたいです。

列挙型 (Java) は次のとおりです。

public enum envelopeType
{
    NOT_SPECIFIED(-1),
    NONE(0),
    IMAGE(1),
    BITMAP(2);

    private int value;

    private envelopeType(int value)
    {
        this.value = value;
    }   
}

JNI コード (C++) は次のとおりです。

JNIEXPORT jint JNICALL Java_Loader_Convert
  (JNIEnv *env, jobject obj, jobject EnvelopeType)

列挙型はオブジェクトとして渡されるため、どうすればその値を取得できますか?

4

3 に答える 3

7

@tbodt から提供されたソリューションを使用できませんでしたが、解決策を見つけることができたほど彼は近かったです。

Java列挙ドキュメントを見るとordinal、列挙値を型として返すメソッドがありintます。

私が使用したコードは、@tbodts ソリューションに記載されているものとほぼ同じでしたが、GetMethodID関数に渡される文字列は異なります。メソッドを作成する必要はなくgetValue、メソッドのシグネチャは.()II()

JNIEXPORT jint JNICALL Java_Loader_Convert(JNIEnv *env, jobject obj, jobject EnvelopeType) {
    jmethodID envelopeGetValueMethod = (*env)->GetMethodID(env, (*env)->FindClass(env, "package/of/envelopeType"), "ordinal", "()I");
    jint value = (*env)->CallIntMethod(env, EnvelopeType, envelopeGetValueMethod);
    switch (value) {
        case -1:
        // not specified
        break;
        case 0:
        // none
        break;
        ...
    }
    // rest of native method
}
于 2015-01-26T22:39:30.920 に答える
3

の値を返すメソッドを提供しvalue、それをネイティブ コードから呼び出して、switchステートメントを使用します。列挙型のメソッドは次のとおりです。

public int getValue() {
    return value;
}

そしてあなたのネイティブメソッド:

JNIEXPORT jint JNICALL Java_Loader_Convert(JNIEnv *env, jobject obj, jobject EnvelopeType) {
    jmethodID envelopeGetValueMethod = (*env)->GetMethodID(env, (*env)->FindClass(env, "package/of/envelopeType"), "getValue", "()I");
    jint value = (*env)->CallIntMethod(env, EnvelopeType, envelopeGetValueMethod);
    switch (value) {
        case -1:
        // not specified
        break;
        case 0:
        // none
        break;
        ...
    }
    // rest of native method
}
于 2013-08-06T06:48:51.343 に答える
3

実際には、メソッドを定義する代わりに、getValue()を呼び出すことができますEnum.ordinal()

より簡単な解決策は、C コードを少し変更し、JNI 関数を呼び出すときに直接使用することです。つまり、オブジェクトの代わりにEnum.ordinal()a を渡します。jintEnum

JNIEXPORT jint JNICALL Java_Loader_convert
  (JNIEnv *env, jobject obj, jint EnvelopeType)

そしてJavaでは、一種の

loader.convert(myEnvelopeType.ordinal());

http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html#ordinal%28%29

于 2015-08-07T09:41:31.977 に答える