设置/获取Java列表<>从C code列表、Java、LT、code

2023-09-06 01:57:51 作者:山河明月祭

的Java code

在Java的code我称之为类 IdentificationResult 其中有3名成员:

enrollmentID enrollmentSettings identParams

下面是类:

 包com.vito.android.framework.service;

类IdentificationResult
{
    类IdentParams {
        byte []的OTP;
        字符串seedId;
    }

    字符串enrollmentID;
    字符串enrollmentSettings;
    名单< IdentParams> identParams;
}
 
JavaGuide邀你参加微软Java技术分享会

在主类我有功能 IdentificationResult GetAuthenticationStatus(),这里是主要的类别:

 公共类TokenManager
{
    / *一些code在这儿... ... * /

    公共IdentificationResult GetAuthenticationStatus()
    {
        / *功能在这里做一些动作... * /
        返回新IdentificationResult;
    }
}
 

C ++ code

我用这种方式调用Java方法,从我的C ++ code

 无效GetAuthenticationStatus()
{
    //附加当前线程。
    JNIEnv的*的env = NULL;
    m_javaVM-> AttachCurrentThread(ENV,NULL);
    如果(ENV == NULL){
        返回-1;
    }

    JCLASS clazz所= NULL;
    clazz所= ENV-> GetObjectClass(m_classObject);
    如果(clazz所== NULL){
        返回-1;
    }

    //获取类的方法。
    jmethodID clazzMethod = NULL;
    ENV->的GetMethodID(clazz中,GetAuthenticationStatus,(五)LCOM / VITO /安卓/框架/服务/ IdentificationResult;);
    如果(clazzMethod == NULL){
        返回VCS_RESULT_ERROR;
    }

    //调用Java的GetAuthenticationStatus功能。
    jobject methodReturnObj = ENV-> CallObjectMethod(m_classObject,clazzMethod);

    //从对象获取IdentificationResult类。
    JCLASS identifyResultClass = ENV-> GetObjectClass(methodReturnObj);
    如果(identifyResultClass == NULL)
    {
        返回-1;
    }

    //获取identParams。
    jfieldID fieldID = ENV-> GetFieldID(identifyResultClass,identParams,*** 1提问***。);
    如果(fieldID == NULL){
        返回-1;
    }
    其他
    {
        *** 2.提问***
    }

}
 

问题

我必须写在这里获得名单,其中,IdentParams> 字段标识

我怎样才能获取或设置字段值?

解决方案

好吧,我不得不解决的问题,并希望分享结果与你,这里是解决方案:

  fieldID = ENV-> GetFieldID(identifyResultClass,identParams,Ljava / UTIL /列表;);
    如果(fieldID!= NULL)
    {
        //查找的java / UTIL /列表级(标准Java类)。
        JCLASS listClass = ENV->的findClass(爪哇/ UTIL /表);
        如果(listClass == NULL){
            DBG_WARNING(DBG_CTX,(找不到类\的Java / UTIL /目录\)\ñ);
            返回-1;
        }

        //获取列表对象字段。
        jobject的ListObject = ENV-> GetObjectField(methodReturnObj,fieldID);
        如果(的ListObject == NULL){
            DBG_WARNING(DBG_CTX,(无法获取ObjectField的\目录\)\ñ);
            返回-1;
        }

        //获取java.util.List.get(INT位置)放在methodID
        jmethodID的GetMethodID = ENV->的GetMethodID(listClass,得,(我)Ljava /郎/对象;);
        如果(的GetMethodID == NULL){
            DBG_WARNING(DBG_CTX,(无法获取放在methodID为\java.util.List.get(INT位置)\)\ñ);
            返回-1;
        }

        //获取INT java.util.List.size()放在methodID
        jmethodID sizeMethodID = ENV->的GetMethodID(listClass,大小,()I);
        如果(sizeMethodID == NULL){
            DBG_WARNING(DBG_CTX,(无法获取放在methodID为\INT java.util.List.size()\)\ñ);
            返回-1;
        }

        //调用INT java.util.List.size()方法,并获得在列表中的项目数。
        INT listItemsCount =(int)的ENV-> CallIntMethod(的ListObject,sizeMethodID);
        DBG_DISPLAY(DBG_CTX,(列出了%i个项目的\ n,l​​istItemsCount));

        的for(int i = 0; I< listItemsCount ++ I)
        {
            //调用java.util.List.get的方法,并得到IdentParams对象通过索引。
            jobject identParamsObject = ENV-> CallObjectMethod(的ListObject,的GetMethodID,我 -  1);
            如果(identParamsObject == NULL)
            {
                DBG_WARNING(DBG_CTX,(无法获取对象从\identParamsObject \索引%I \ñ。,我 -  1));
            }


        }
 

由于@Joop埃根,他给了我很好的想法!

Java Code

In Java code I have class called IdentificationResult which has 3 members:

enrollmentID enrollmentSettings identParams.

Here is the class:

package com.vito.android.framework.service;

class IdentificationResult
{
    class IdentParams {
        byte[] otp;
        String seedId;
    }

    String enrollmentID;
    String enrollmentSettings;
    List<IdentParams> identParams;
}

In the main class I have function IdentificationResult GetAuthenticationStatus( ), here is the main Class:

public class TokenManager 
{
    /* Some code goes here ... */

    public IdentificationResult GetAuthenticationStatus( )
    {
        /* Function do some actions here ... */
        return new IdentificationResult;
    }
}

C++ Code

I call Java method from my C++ code in this way

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 *** 
    }

}

Questions

What I must write here to get List<IdentParams> field ID?

How I can Get or Set field value?

解决方案

Okay, I have solve the problem and want to share result with you, here is solution:

    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));
            }


        }

Thanks to @Joop Eggen he gives me great idea !!!