设置/获取Java列表<>来自C代码

时间:2011-11-17 14:38:45

标签: java android c++ c java-native-interface

Java代码

在Java代码中,我有一个名为IdentificationResult的类,它有3个成员:

  1. enrollmentID
  2. enrollmentSettings
  3. identParams
  4. 这是班级:

    package com.vito.android.framework.service;
    
    class IdentificationResult
    {
        class IdentParams {
            byte[] otp;
            String seedId;
        }
    
        String enrollmentID;
        String enrollmentSettings;
        List<IdentParams> identParams;
    }
    

    在主类我有函数IdentificationResult GetAuthenticationStatus( ),这里是主类:

    public class TokenManager 
    {
        /* Some code goes here ... */
    
        public IdentificationResult GetAuthenticationStatus( )
        {
            /* Function do some actions here ... */
            return new IdentificationResult;
        }
    }
    

    C ++代码

    我以这种方式从我的C ++代码中调用Java方法

    void GetAuthenticationStatus( )
    {
        // Attach current thread.
        JNIEnv *env = NULL;
        m_javaVM->AttachCurrentThread( env, NULL );
        if( env == NULL ) {
            return -1;
        }
    
        jclass clazz = NULL;
        clazz = env->GetObjectClass( m_classObject );
        if( clazz == NULL ) {
            return -1;
        }
    
        // Get class method.
        jmethodID clazzMethod = NULL; 
        env->GetMethodID( clazz, "GetAuthenticationStatus", "(V;)Lcom/vito/android/framework/service/IdentificationResult;" );
        if( clazzMethod == NULL ) {
            return VCS_RESULT_ERROR;
        }
    
        // Call Java 'GetAuthenticationStatus' function.
        jobject methodReturnObj = env->CallObjectMethod( m_classObject, clazzMethod );
    
        // Get IdentificationResult Class from Object.
        jclass identifyResultClass = env->GetObjectClass( methodReturnObj );
        if( identifyResultClass == NULL ) 
        {
            return -1;
        }
    
        // Get identParams.
        jfieldID fieldID = env->GetFieldID( identifyResultClass , "identParams", "***1. Question***");
        if( fieldID == NULL ) {
            return -1;
        }
        else
        {
            *** 2. Question *** 
        }
    
    }
    

    问题

    1. 我必须在此处写一下List<IdentParams>字段ID?

    2. 我如何获取或设置字段值?

2 个答案:

答案 0 :(得分:10)

好的,我已经解决了这个问题并希望与您分享结果,这里有解决方案:

    fieldID = env->GetFieldID( identifyResultClass , "identParams", "Ljava/util/List;" );
    if( fieldID != NULL ) 
    {
        // Find "java/util/List" Class (Standard JAVA Class).
        jclass listClass = env->FindClass( "java/util/List" );
        if( listClass == NULL ) {
            DBG_WARNING(DBG_CTX, ("Can't Find Class \"java/util/List\".\n"));
            return -1;
        }

        // Get List object field.
        jobject listObject = env->GetObjectField( methodReturnObj, fieldID );
        if( listObject == NULL ) {
            DBG_WARNING(DBG_CTX, ("Can't get ObjectField for \"List\".\n"));
            return -1;
        }

        // Get "java.util.List.get(int location)" MethodID
        jmethodID getMethodID = env->GetMethodID( listClass, "get", "(I)Ljava/lang/Object;" );
        if( getMethodID == NULL ) {
            DBG_WARNING(DBG_CTX, ("Can't get MethodID for \"java.util.List.get(int location)\".\n"));
            return -1;
        }

        // Get "int java.util.List.size()" MethodID
        jmethodID sizeMethodID = env->GetMethodID( listClass, "size", "()I" );
        if( sizeMethodID == NULL ) {
            DBG_WARNING(DBG_CTX, ("Can't get MethodID for \"int java.util.List.size()\".\n"));
            return -1;
        }

        // Call "int java.util.List.size()" method and get count of items in the list.
        int listItemsCount = (int)env->CallIntMethod( listObject, sizeMethodID );
        DBG_DISPLAY(DBG_CTX,("List has %i items\n", listItemsCount));

        for( int i=0; i<listItemsCount; ++i )
        {
            // Call "java.util.List.get" method and get IdentParams object by index.
            jobject identParamsObject = env->CallObjectMethod( listObject, getMethodID, i - 1 );
            if( identParamsObject == NULL )
            {
                DBG_WARNING(DBG_CTX, ("Can't get Object from \"identParamsObject\" at index %i.\n", i - 1));
            }


        }

感谢@Joop Eggen,他给了我很好的建议!!!

答案 1 :(得分:2)

不要考虑以下可编辑,但你会明白:

jobject list = env->GetObjectField(methodReturnObj, "identParams"); // java.util.List
getMID = env->GetMethodID (listClass, "get","(I)Object");
jobject someIdentParam = env->CallMethod(getMid, new Object[] { list, 0 }); // java.lang.Object

首先阅读文档。