JNI jstring'i char'a dönüştürüyor *


113

jstringJNI kullanımıyla veri türü olarak Java'dan C koduna bir URL dizisi geçirdim . Ve kütüphane yöntemimin char *as url'ye ihtiyacı var .

Nasıl dönüştürebilirsiniz jstringiçinde char *?

Not: C'de jcharArray kullanmanın herhangi bir avantajı var mı? (ör char []. yerel yöntemde dizge yerine geçirme )


Belgelere bakmayı düşündünüz mü?
Marquis of Lorne

Yanıtlar:


227

İşte JNI ile başladığımda bulduğum birkaç faydalı bağlantı

http://en.wikipedia.org/wiki/Java_Native_Interface
http://download.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html

probleminizle ilgili olarak bunu kullanabilirsiniz

JNIEXPORT void JNICALL Java_ClassName_MethodName(JNIEnv *env, jobject obj, jstring javaString)   
{
   const char *nativeString = env->GetStringUTFChars(javaString, 0);

   // use your string

   env->ReleaseStringUTFChars(javaString, nativeString);
}

1
nativeStringsabit tutmak gerekli mi?
Prasham

5
ikinci bağlantıyı kontrol ederseniz, GetStringUTFChars işlevinin prototipi: const jbyte * GetStringUTFChars (JNIEnv * env, jstring string, jboolean * isCopy); yani gerçekten bir seçeneğiniz yok
Jason Rogers

1
Burada (ve Wikipedia sayfasında) özetlenen tekniğin, her durumda çalışmayabilecek değiştirilmiş UTF-8 kodlamasını kullandığını belirtmekte fayda var. Bkz developer.android.com/guide/practices/...
cqcallaw

1
Teşekkürler, işe yarıyor ama ilginçtir ki const char * char'a dönüşemez * :).
CoDe

1
@CoDe Teknik olarak, biraz sihirle olabilir, ancak bundan kaçınılması en iyisidir; muhtemelen constbir nedenden dolayı beyan edilmiştir . Senin sorunun doğru cevabı etmektir strcpygelen const char*bir içine char*. Bu char*size istediğiniz değişkeni sağlamalıdır .
Loduwijk

51

Önce Jason Rogers'ın cevabına teşekkürler.

In Android && cpp bu şekilde olmalıdır:

const char *nativeString = env->GetStringUTFChars(javaString, nullptr);

// use your string

env->ReleaseStringUTFChars(javaString, nativeString);

Bu hataları düzeltebilir:

1.hata: '->' temel işleneni işaretçi olmayan 'JNIEnv {aka _JNIEnv}' türüne sahip

2. hata: '_JNIEnv :: GetStringUTFChars (JNIEnv * &, _jstring * &, bool)' çağrısı için eşleşen işlev yok

3. hata: '_JNIEnv :: ReleaseStringUTFChars (JNIEnv * &, _jstring * &, char const * &)' çağrısı için eşleşen işlev yok

4.add "env-> DeleteLocalRef (nativeString);" sonunda.


(* Env) -> yerine env->
AlexanderNajafi'ye

2
(*env)->C ++ değil, sadece C kullanıyorsanız ihtiyacınız olacak.
sixones
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.