pasando una matriz de cadenas de Java a C con JNI

2 minutos de lectura

avatar de usuario
masay

Tengo una matriz de cadenas como {"myname","yourname","hisname"} y estoy tratando de enviar esta matriz a C con usar JNI. No pude encontrar ninguna solución clara para esto. He tratado de tomar esta cadena como un chararray pero sin éxito.

¿Hay alguna forma de hacer esto?

avatar de usuario
bola 8

Puedes escribir una función simple que tome un jobjectArray objeto, envíe cada uno a jstring y luego llame GetStringUTFChars en eso.

Me gusta esto:

void MyJNIFunction(JNIEnv *env, jobject object, jobjectArray stringArray) {

    int stringCount = env->GetArrayLength(stringArray);

    for (int i=0; i<stringCount; i++) {
        jstring string = (jstring) (env->GetObjectArrayElement(stringArray, i));
        const char *rawString = env->GetStringUTFChars(string, 0);
        // Don't forget to call `ReleaseStringUTFChars` when you're done.
    }
}

  • es el jobject object entrada requerida?

    – usuario1893354

    12/09/2019 a las 19:23

  • ¿Necesito llamar? DeleteLocalRef en el temporal jstring objeto devuelto por GetObjectArrayElement?

    – Jirafa Violeta

    24 de abril de 2020 a las 17:37


Sí, hay una manera. pasarías la String[] en su método nativo desde el lado de Java y eso se vería en el lado de C/C++ como un jobjectArray. Entonces usarías GetObjectArrayElement() conseguir un jstring en un índice dado y luego usar GetStringUTFChars() o GetStringChars() para obtener un puntero C/C++ a los datos de cadena subyacentes.

Y si no lo sabes, el Libro JNI es una valiosa referencia.

  • Gracias por referencia. Lo leí. Resolví mi problema al enviar una cadena al lado C. Intenté enviar una matriz para practicar y tuve éxito. Gracias por la ayuda. Hay dos respuestas correctas y si no te importa, quiero darle repetición a 8ball…

    – masay

    13 de junio de 2011 a las 10:42


  • El enlace al “Libro JNI” está roto.

    –Markus Weninger

    20 de diciembre de 2016 a las 9:20

avatar de usuario
gobierno

se puede hacer de la siguiente manera:

(JNIEnv *env, jobject object, jobjectArray prdctini)
    {
        const char *param[20];
        jsize stringCount = (*env).GetArrayLength(prdctini);

          for (int i=0; i<stringCount; i++) {
                  jstring string = (jstring) (*env).GetObjectArrayElement( prdctini, i);
                  param[i] = (*env).GetStringUTFChars( string, NULL);
          }
          cout<<"U_Id="<<param[0]<<endl;
          cout<<"aggregation="<<param[1]<<endl
}

  • Qué tal si ReleaseStringUTFChars ?

    – Dmitri Zaytsev

    10 de julio de 2014 a las 10:01

Recuerda usar

env->GetArrayLength(stringArray);

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad