在Java的code我称之为类 IdentificationResult
其中有3名成员:
enrollmentID
enrollmentSettings
identParams
。
下面是类:
包com.vito.android.framework.service;
类IdentificationResult
{
类IdentParams {
byte []的OTP;
字符串seedId;
}
字符串enrollmentID;
字符串enrollmentSettings;
名单< IdentParams> identParams;
}
在主类我有功能 IdentificationResult GetAuthenticationStatus()
,这里是主要的类别:
公共类TokenManager
{
/ *一些code在这儿... ... * /
公共IdentificationResult GetAuthenticationStatus()
{
/ *功能在这里做一些动作... * /
返回新IdentificationResult;
}
}
我用这种方式调用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,listItemsCount));
的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埃根,他给了我很好的想法!
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;
}
}
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 ***
}
}
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 !!!