Android JNI obtiene dos campos de la clase Java

Antes de publicar cualquier código o algo, permítanme explicar lo que estoy tratando de lograr: lo que estoy tratando de hacer es obtener shaders de carga de una carpeta de activos, y pasar una matriz de objetos PongDroidShader a C + + para que pueda compilar y cargar ellos.

En mi clase Java, tengo una función que pasa por cada archivo de sombreado en la carpeta shaders y lo analiza, carga en un objeto String , mientras que también comprueba qué tipo de tipo de sombreado es a través de su extensión de archivo (.eg, un vértice Tendría una extensión .vert ). Una vez que lo haya logrado, lo envío a mi función native compileShaders , que toma la matriz de objetos PongDroidShader y el tamaño de la matriz.

Después de eso, analizar y vincular los shaders del código JNI.

Hasta ahora, tengo problemas para que el JNI reconozca el código Java y lo cargue en variables. Lo que tengo hasta ahora es el siguiente:

Código Java

 public final class PongDroidShader { public String mShaderSrc; public ShaderType mType; } private class ShaderHandler { ... private native void compileShaders(PongDroidShader[] shaders, int shaderCount); ... 

Código JNI / C ++

 JNIEXPORT void JNICALL Java_com_grepwise_pongdroid_PongDroid_00024ShaderHandler_compileShaders (JNIEnv * env, jobject obj, jobjectArray shaders, jint sizeOfShaders) { for( int i = 0; i < sizeOfShaders; ++i ) { jclass clazz = env->FindClass( "com/grepwise/pongdroid/PongDroidShader" ); jclass shaderTypeEnum = env->FindClass( "com/grepwise/pongdroid/ShaderType" ); jfieldID field = env->GetFieldID( clazz, "mType", "ShaderType" ); jobject shader = env->GetObjectArrayElement( shaders, i ); const jchar jShaderChr = env->GetCharField( shader, env->GetFieldID( clazz, "mShaderSrc", "java/lang/String" ) ); jstring jShaderStr = env->NewString( &jShaderChr, sizeof( jShaderChr ) ); const char* shaderStr = env->GetStringUTFChars( jShaderStr, 0 ); //TODO implement GL Shader Manipulation and Allocation here optim::Config::Log::info( "Testing shader: %s", shaderStr ); delete shaderStr; } } 

He omitido mucho de lo que existe en la base de código sólo por razones de simplicidad. Tenga en cuenta que aunque compileShaders no se muestra siendo llamado, es llamado por la clase de actividad que envuelve su clase padre como una clase privada interna.

Hasta ahora, mi salida de registro es la siguiente:

 04-25 22:20:56.267 11985 11985 D dalvikvm: Trying to load lib /data/data/com.grepwise.pongdroid/lib/libnativepd.so 0x4051c800 04-25 22:20:56.275 11985 11985 D dalvikvm: Added shared lib /data/data/com.grepwise.pongdroid/lib/libnativepd.so 0x4051c800 04-25 22:20:56.322 11985 11985 D dalvikvm: GetFieldID: unable to find field Lcom/grepwise/pongdroid/PongDroidShader;.mType:ShaderType 04-25 22:20:56.322 11985 11985 D dalvikvm: GetFieldID: unable to find field Lcom/grepwise/pongdroid/PongDroidShader;.mShaderSrc:java/lang/String 04-25 22:20:56.330 11985 11985 I dalvikvm: at com.grepwise.pongdroid.PongDroid$ShaderHandler.compileShaders(Native Method) 04-25 22:20:56.330 11985 11985 I dalvikvm: at com.grepwise.pongdroid.PongDroid$ShaderHandler.access$1(PongDroid.java:128) 04-25 22:20:56.330 11985 11985 I dalvikvm: at com.grepwise.pongdroid.PongDroid.onCreate(PongDroid.java:72) 

Creo que deberías estar usando esto para obtener tus campos:

 env->GetFieldID( clazz, "mType", "Lcom/grepwise/pongdroid/ShaderType;" ); env->GetFieldID( clazz, "mShaderSrc", "Ljava/lang/String;" ) 

Y mueva la clase y el campo que sale del lazo.

EDIT: También esto:

 const jchar jShaderChr = env->GetCharField(...) 

Para obtener el valor String de mShaderSrc es incorrecto.

Usted debe usar:

 jstring jShaderStr = (jstring)env->GetObjectField(...); const char* shaderSrc = env->GetStringUTFChars(jShaderStr, 0); // ... here use shaderSrc env->ReleaseStringUTFChars(hShaderStr, shaderSrc); 

Debe obtener el campo privado de la instancia y pasar la firma como tercer argumento.

 jfieldID field = env->GetFieldID( obj, "mShaderSrc", "Ljava/lang/String;" ); 

Resolví el problema: Eclipse no estaba reconociendo mi classpath. Si alguien está teniendo problemas similares, entonces tienen que ir a Window-> Preferences-> Java-> Build Paths-> Classpath, y agregar el classpath a la plataforma SDK de Android que están utilizando, así como la ruta a la clase de su proyecto Raíz (por ejemplo, $PROJECT_ROOT/bin/classes ).

  • Enviar cadena de teléfono Android a PC
  • Convertir c # a puro java?
  • Obtenga el país de un determinado huso horario de Java
  • Problema con selector en RecycleView
  • ¿Cómo subir videos a Facebook usando Facebook Android SDK 4.x?
  • Android studio no puede resolver el símbolo común, que falta en el paquete android.gms
  • Android JUnit: Cómo hacer que una excepción cause un caso de prueba para pasar (anotación @Test)
  • Creación de una aplicación de pantalla de bloqueo de Android.
  • Cómo eliminar el relleno alrededor de los botones en Android?
  • ¿Por qué funciona este código Java? Compilador no se queja de cierre
  • Cómo port jaxb anotación a la biblioteca simpleXml?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.