androidx는 새로운 패키지 구조로서 Android 운영체제에 번들로 제공되고 앱의 APK와 함께 패키지로 제공되는 패키지를 명확하게 보여줍니다. 앞으로 Android *. 패키지 계층 구조는 운영 체제와 함께 제공되는 Android 패키지 용으로 예약됩니다. 다른 패키지들은 새로운 androidx. * 패키지 계층에서 발행 될 것입니다.
2, Client 코드에서 Native Service를 ServiceManager로 가져와 Service의 함수들을 이용
모두 시도해본 것은 아니나 아래의 경우의 수가
모두 AIDL or Binder를 통하여 IPC가 가능
Native Service <-> Java Client
Native Service <-> Native Client
Java Service <-> Java Client
Java Service <-> Native Client
#AIDL
package android.binder.example;
/**
* AIDL file for Binder API generating
*
*/
interface IDemoAPI{
String getName();
String getFullName(String part);
int sum(int a,int b);
}
#JAVA Client
package com.technicolor.clienttest;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.binder.example.IDemoAPI;
import java.lang.reflect.Method;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private IDemoAPI mService;
private static final String TAG = "HelloActivity IDemoAPI";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getDemoAPIService();
try{
Log.d(TAG, "1+2="+Integer.toString(mService.sum(1,2)));
Log.d(TAG, "Name="+mService.getName());
Log.d(TAG, "FullName="+mService.getFullName("AAABBBCCC"));
}catch(Exception e){
Log.d(TAG,e.toString());
}
}
static final String SERVICE_NAME="android.binder.example";
/*
* Get binder service
*/
private void getDemoAPIService()
{
IBinder binder=null;
Log.d(TAG,"getDemoAPIService");
try{
//android.os.ServiceManager is hide class, we can not invoke them from SDK. So we have to use reflect to invoke these classes.
Object object = new Object();
Method getService = Class.forName("android.os.ServiceManager").getMethod("getService", String.class);
Object obj = getService.invoke(object, new Object[]{new String(SERVICE_NAME)});
binder = (IBinder)obj;
}catch(Exception e){
Log.d(TAG, e.toString());
}
if(binder != null){
mService = IDemoAPI.Stub.asInterface(binder);
Log.d(TAG, "Find binder");
}
else
Log.d(TAG,"Service is null.");
}
}
#Native Service
#include "server.h"
int main(int argc, char *argv[])
{
sp proc(ProcessState::self());
//get service manager
sp sm = defaultServiceManager();
//Register a service with the SERVICE_NAME
sm->addService(String16(SERVICE_NAME),new demo_api::DemoAPI());
ALOGE("%s service is starting.....",SERVICE_NAME);
//Start Service
ProcessState::self()->startThreadPool();
//Loop for waiting for request
IPCThreadState::self()->joinThreadPool();
return 0;
}