jstring을 char로 변환하는 JNI *


113

jstringJNI를 사용 하여 Java에서 C 코드로 URL 문자열을 데이터 유형으로 전달했습니다. 그리고 내 라이브러리 방법 char *에는 URL이 필요합니다 .

어떻게 변환 할 수 jstring있는 char *?

추신 : C에서 jcharArray를 사용하면 어떤 이점이 있습니까? (즉 char [], 네이티브 메서드에서 문자열 대신 전달 )


문서 참조를 고려해 보셨습니까?
론의 후작

답변:


227

JNI를 시작할 때 찾은 몇 가지 유용한 링크가 있습니다.

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

당신은 이것을 사용할 수 있습니다

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
nativeString일정하게 유지해야 합니까?
Prasham 2010

5
두 번째 링크를 확인하면 GetStringUTFChars 함수의 프로토 타입은 다음과 같습니다. const jbyte * GetStringUTFChars (JNIEnv * env, jstring string, jboolean * isCopy); 당신은 정말의 choise하지 않아도
제이슨 로저스

1
여기 (및 Wikipedia 페이지)에 설명 된 기술이 모든 상황에서 작동하지 않을 수있는 수정 된 UTF-8 인코딩을 사용한다는 점에 주목할 가치가 있다고 생각합니다. developer.android.com/guide/practices/…
cqcallaw

1
감사합니다, 그 작업이지만 흥미롭게도 const char *는 char * :)로 변환 할 수 없습니다.
CoDe 2015

1
@CoDe 기술적으로, 그것은 약간의 마법과 함께 할 수 있지만 그것은 피하는 것이 가장 좋습니다. 아마도 const이유 가있을 것입니다 . 문제에 대한 올바른 응답하는 것입니다 strcpy로부터 const char*char*. 그것은 char*당신이 원하는 mutable 을 제공 할 것입니다 .
Loduwijk

51

먼저 Jason Rogers의 답변에 감사드립니다.

에서 안드로이드 && CPP는 이 있어야한다 :

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

// use your string

env->ReleaseStringUTFChars(javaString, nativeString);

이 오류를 수정할 수 있습니다.

1. 오류 : '->'의 기본 피연산자에 포인터 유형이 아닌 'JNIEnv {aka _JNIEnv}'가 있습니다.

2. 오류 : '_JNIEnv :: GetStringUTFChars (JNIEnv * &, _jstring * &, bool)'호출에 일치하는 함수가 없습니다.

3. 오류 : '_JNIEnv :: ReleaseStringUTFChars (JNIEnv * &, _jstring * &, char const * &)'호출에 일치하는 함수가 없습니다.

4. "env-> DeleteLocalRef (nativeString);"추가 끝에.


env-> 대신 (* env)->가 필요합니다.
AlexanderNajafi

2
(*env)->C ++가 아닌 C를 사용하는 경우 에만 필요 합니다.
sixones
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.