2016-12-09 2 views
1

소포를 안드로이드 응용 프로그램에 소켓을 통해 보내려고합니다. 클라이언트는 libbinder (C++)에 있고 서버는 소포를 다시 만들어야하는 안드로이드 응용 프로그램입니다. 나는 한동안 해결책을 찾고 있었지만, 소포를 직렬화하고 서버 측에서 다시 빌드하는 방법을 모른다. 이것이 어떻게 수행 될 수 있는지에 대한 아이디어가 있습니까?소포를 통해 소포

감사

내가이

send(client, b, sizeof(b), 0); 

서버처럼 보내

클라이언트

Parcel parc = Parcel(); 
double three = 5.5; 
parc.writeDouble(three); 

unsigned char b[sizeof(parc)]; 
std::memcpy(b, &parc, sizeof(parc)); 

그런 다음 데이터를 처리하는 코드의 일부

private int count 
private InputStream in = null; 
try { 
    in = socket.getInputStream(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
try { 
    count = in.read(bytes); 
}catch (IOException e) { 
    e.printStackTrace(); 
} 

Parcel parcel = Parcel.obtain(); 
parcel.unmarshall(bytes, 0, bytes.length); 
parcel.setDataPosition(0); 

double d = parcel.readDouble(); 

Log.v("----double---", "double" + d); 

답변

0

좋은 예는 here입니다.

일반적으로 개체를 재구성 (소포에서 작성) 할 수있는 클래스가 있는지 확인해야합니다.

+0

그래서 ...이 예제에서 깨달은 것부터 unmarshall 함수를 사용하여 바이트 배열에서 구획을 다시 빌드 할 수 있습니다. 클라이언트 측에서 소포를 직렬화하는 방법에 대한 아이디어, libbinder (C++)? –

+0

가장 쉬운 방법은 [Parcel' 클래스의 소스 코드] (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1)를 보는 것입니다. /android/os/Parcel.java#Parcel.writeByte%28byte%29). 기본적으로 직렬화 된 바이트 스트림입니다. 메소드'writeValue()'를 보라. 각 항목에 대해 항목이 무엇인지 나타내는 코드를 작성한 다음 항목의 직렬화 된 항목이 표시됩니다. 서로 다른 여러 알려진 유형을 소포하고 바이트 스트림을 덤프하는 간단한 프로그램을 만듭니다. 당신은 그것을 알아낼 수 있어야합니다. –

+0

Parcel.cpp의 소스 코드는 다음에서 찾을 수 있습니다. https://android.googlesource.com/platform/frameworks/native/+/jb-mr1-release/libs/binder/Parcel.cpp libbinder를 사용하는 경우 'Parcel' 클래스를 직접 사용할 수 있어야합니다. –

관련 문제