2017-04-03 1 views
1

안녕하세요. JNI 질문이 있습니다. 클래스가 있습니다. 사용자 공간의 UserConfig 클래스에 변수 a, b, c 및 d를 설정했습니다.클래스 내의 클래스 배열에있는 변수에 액세스하십시오. JNI

public class SetConfig extends Config { 
    int status; 

    public native int setConfig_IOCTL(); 

} 

public class Config { 
    public Config() { User = new UserConfig[100]; } 

    int number; 

    UserConfig[] user; 
} 

public class UserConfig { 
    int a; 
    int b; 
    int c; 
    int d; 
} 

다음 변수를 커널 드라이버에 전달되는 구조체에 할당하려고합니다.

typedef struct { 
    int status; 
    Config_t config; 
} getConfig; 

typedef struct { 
    int number; 
    UserConfig_t userConfig[100]; 
} Config_t; 

typedef struct { 
    int a; 
    int b; 
    int c; 
    int d; 
} UserConfig_t; 

나는 제대로 UserConfig를 클래스 내의 필드에 액세스 할 수 fieldID가를 얻는 데 문제가 올바른 방향으로 날 가리 키도록 도움을 찾고 있었다.

나는 이것이 잘못되었다는 것을 알고 있습니다.

JNIEXPORT jint JNICALL com_example_test_Config_config_IOCTL(JNIEnv *env, jobject instance) { 

    getConfig_t tempConfig; 

    jclass thisClass = (*env)->GetObjectClass(env, instance); 
    jfieldID fid = (*env)->GetFieldID(env, thisClass, "a", "[LTest/jni/UserConfig;"); 
    tempConfig.config.userConfig[0] = (*env)->GetIntField(instance, fid); 

} 

JNI 사용을 시작한 사람이라면 도움이 될 것입니다.

답변

2

C 함수의 이름은 com.example.test.Config.config_IOCTL() 메서드와 연결되지만 실제 네이티브 메서드는 <some_package>.SetConfig.setConfig_IOCTL()입니다. 클래스 이름도 메소드 이름도 일치하지 않습니다. javah 유틸리티를 사용하여 Java 클래스의 원시 메소드 선언에 해당하는 적절한 C 선언을 생성 할 수 있습니다.

  • 가의 jclass를 가져옵니다 :

    제대로 갖는 자바 네이티브 메소드 선언에 C 함수 선언과 일치, 다음을 수행 (그것이 현재 선언으로) 기본 방법을 필요 해요 메소드가 호출 된 객체.

  • jobjectarray 해당 개체의 user 필드에 대응하는 검색 (a UserConfig[])
  • 는의 개체 의 원하는 필드의 fieldIds 찾기 GetObjectArrayElement()
  • 통해 어레이의 소정 요소를 (이?) 검색 그 fieldIDs '클래스
  • 사용은 매우 혼란이다,

전체 필드의 값을 검색 할 수 있습니다. 일반적으로 JNI 쪽을 더 쉽게 작성할 수 있도록 Java 쪽에서 할 수있는 한 많은 일을하는 것이 좋습니다. 나는 그 네이티브 메소드 구현의 작업을 최소화하는 방법을 당신이 볼 수있는 확신

public class SetConfig extends Config { 
    int status; 

    public int setConfig_IOCTL() { 
     return setConfig_IOCTL(user[number].a, user[number].b, user[number].c, 
       user[number].d); 
    } 

    private native int setConfig_IOCTL(int a, int b, int c, int d); 
} 

을, 그리고 수를 최소화 예를 들어, 당신은 (원하는 의미에 대해 조금 추론)이 대신 일을 할 수 호출 할 필요가있는 JNI 함수 (아마 제로). 물론 해당 네이티브 구현에는 현재 사용중인 것과 다른 서명이 있습니다.

+0

답장을 보내 주셔서 감사합니다. 코드는 예제 코드이며 구현 한 코드는 아닙니다. 나는 너의 제안 감사를 시도 할 것이다. – Spoons

관련 문제