美文网首页
使用AIDL获取服务器的C++字符串

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

作者: Android初学者 | 来源:发表于2017-11-23 11:22 被阅读0次

    先搭建服务器

    创建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) {

    }

    }

    相关文章

      网友评论

          本文标题:使用AIDL获取服务器的C++字符串

          本文链接:https://www.haomeiwen.com/subject/toxzvxtx.html