使用AIDL获取服务器的C++字符串

2017-11-23  本文已影响0人  Android初学者

先搭建服务器

创建AIDL文件

interface IGetCppStringInterface {

String getCppString();

}

服务器中加载C++库

public class GetCppStringService extends Service {

// 静态代码块中加载C++库

static {

System.loadLibrary("native-lib");

}

class MyBinder extends IGetCppStringInterface.Stub {

@Override

public String getCppString() throws RemoteException {

return stringFromJNI2();

}

}

@Override

public IBinder onBind(Intent intent) {

return new MyBinder();

}

// C++的方法,记得用native修饰

public native String stringFromJNI2();

}

服务器主页面代码

/**

* AIDL服务端、NDK环境搭建

* 使用AIDL访问当前服务端中C++的字符串

*/

public class MainActivity extends AppCompatActivity {

// 静态代码块中加载C++库

static {

System.loadLibrary("native-lib");

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

// Example of a call to a native method

TextView tv = (TextView) findViewById(R.id.sample_text);

tv.setText(stringFromJNI());

}

// C++的方法,记得用native修饰

public native String stringFromJNI();

}

创建客户端

将在服务中创建的AIDL复制到客户端,然后客户端代码实现

/**

* 初始化视图

* 绑定服务端的Service

* 通过接口ServiceConnection获取aidl实例

* 按钮中使用aidl实例获取服务端中C++的字符串

*/

public class MainActivity extends AppCompatActivity implements View.OnClickListener, ServiceConnection {

protected Button mGetCppStringBtn;

protected TextView mTextView;

private IGetCppStringInterface mIGetCppStringInterface;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

super.setContentView(R.layout.activity_main);

initView();

bindService();

}

@Override

public void onClick(View view) {

if (view.getId() == R.id.get_cpp_string_btn) {

try {

String cppString = mIGetCppStringInterface.getCppString();

mTextView.setText(cppString);

} catch (RemoteException e) {

e.printStackTrace();

Toast.makeText(this, "错误", Toast.LENGTH_SHORT).show();

}

}

}

private void initView() {

mGetCppStringBtn = (Button) findViewById(R.id.get_cpp_string_btn);

mGetCppStringBtn.setOnClickListener(MainActivity.this);

mTextView = (TextView) findViewById(R.id.text_view);

}

private void bindService() {

Intent intent = new Intent("get_cpp_action");

intent.setPackage("net.bwie.monthexam");

boolean isBindSuccessful = bindService(intent, this, Context.BIND_AUTO_CREATE);

Toast.makeText(this, "是否成功:"+ isBindSuccessful, Toast.LENGTH_SHORT).show();

}

@Override

public void onServiceConnected(ComponentName name, IBinder iBinder) {

mIGetCppStringInterface = IGetCppStringInterface.Stub.asInterface(iBinder);

}

@Override

public void onServiceDisconnected(ComponentName name) {

}

}

上一篇 下一篇

猜你喜欢

热点阅读