先搭建服务器
创建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) {
}
}