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.
- cómo detectar este gesto de movimiento específico a través de sensores?
- ¿Por qué no puedo instanciar este Fragmento en Android?
- Utilizando puerto serie RS-232 en android?
- Implementar seguridad a nivel de firma en los servicios de Android con más de una firma permitida
- ¿Es posible tener iconos en las pestañas de la barra de acción para Android?
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)
- Mejor detección de corrupción de SQLite
- Necesito descargar varias imágenes al directorio para poder acceder al contenido sin conexión
- Creación de un esquema de contraseña fuerte cuando se almacenan todos los datos en el dispositivo
- Establecer credenciales en una vista Web de Android mediante una conexión HTTPS segura
- Redes Android
- Cambiar el fondo ListView - comportamiento extraño
- GZIP en Android
- Encriptación de Android
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
).
- Programación de Android: GCMIntentService Stuck at WakeLock
- Android Play Store – primera versión de la fecha enviada