Предполагая, что опубликованный вами фрагмент кода C ++ завершен, вы получаете нарушение прав доступа, поскольку вам необходимо выделить args[i]
перед копированием значения в него - args[i] = new char[ len + 1 ]
подойдет.
Вы можетена самом деле вызовите метод из C ++, который возвращает массив строк Java, предположим, что ваш метод был:
public static String[] getData() { return array; }
Тогда на нативной стороне вы сможете сделать что-то вроде:
jmethodID method = env->GetStaticMethodID( cls, "getData", "()[Ljava/lang/String;" );
jarray data = (jarray) env->CallStaticObjectMethod( cls, method );
// assumption: the result of getData() is never null
jsize const length = env->GetArrayLength( data );
// assumption: the String[] is always of length > 0
char** args = new char*[ length ];
for( jsize index(0); index < length; ++index )
{
jstring element = (jstring) env->GetObjectArrayElement( data, index );
// assumption: there are no null strings in the array
char const* nativeString = env->GetStringUTFChars( element, 0 );
jsize const nativeLength = strlen( nativeString );
args[index] = new char[ nativeLength + 1 ];
strncpy( args[index], nativeString, nativeLength );
env->ReleaseStringUTFChars( element, nativeString );
env->DeleteLocalRef( element );
}
Я не пытался скомпилировать приведенный выше фрагмент, поэтому может быть одна или две ошибки, но это должно быть хорошей отправной точкой.Я оставил код, используя массив char * и собственные строки, поэтому в какой-то момент код должен будет вызывать delete[]
для каждого члена массива и самого массива.В конечном итоге может оказаться проще использовать std::vector
и std::string
для управления памятью в зависимости от того, как будут использоваться предоставленные строки.