代码在评论中。

JNI:

为什么需要JNI:

因为android是由【JAVA & C/C++】组成。Java运行在Dalvik虚拟机中。

没有办法直接访问底层硬件。底层HW相关目前技术一般都用C语言,不会用java,C速度也比较快。

怎么从JAVA语言传送数据到C语言中:

1. java中会调用native标识的函数,这个函数就是经典了。

2.当然这些native的函数怎么调用,就得加载一个提供C函数包,叫共享库(ex:libNewJNI.so)

3.问题来了,这.so文件怎么来的? 从一下两个文件编译后产生的(.h & .c/cpp),当然Android.mk中设置编译选项楼。

  

4.完成了,很简单吧。

AIDL:

为什么需要AIDL:

AIDL机制就是处理客户端和服务端的通信,通过AIDL机制,客户端通过调用服务端提供的接口便于跨进程调用其他应用程序.
Service分为本地服务和远程服务,远程服务就一定要用到AIDL技术实现,因为android的不同应用是在不同的进程中运行的,

也是彼此独立的,如果在一个应用中访问另一个应用,也就是调用远程服务,就要把服务端定义的AIDL文件放到客户端,

这样才可以实现远程服务调用。

怎么从一个进程调动另一个进程:

1.首先AIDL代码是?

很简单,后缀名仅仅是.aidl,内容就是interface class。

2.怎么用AIDL?

也简单,就是编译后aidl文件就变成了,*.java文件

打开文件看的话,你又明白了,是一个Binder

static abstract class Stub extends android.os.Binder implements android.com.personservice.IPerson

3.客户端怎么调用这个Stub(调用server传来的数据)

private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName arg0) {
} // 因为有可能有多个应用同时进行RPC操作,所以同步该方法
@Override
public synchronized void onServiceConnected(ComponentName arg0,
IBinder binder) {
// 获得IPerson接口
person = IPerson.Stub.asInterface(binder);
if (person != null) {
try {
// RPC方法调用
String name = person.getName();
Toast.makeText(MainActivity.this, "远程进程调用成功!值为 : " + name,
Toast.LENGTH_LONG).show();
} catch (RemoteException e) {
e.printStackTrace();
Toast.makeText(MainActivity.this, "远程进程调用失败! ",
Toast.LENGTH_LONG).show();
}
}
}
};

4.服务端和客户端都必须有相同名字aidl文件吗?

当然,客户端包含的interface比服务端少是可以的,

因为服务端是提供interface的,所以必须包含客户端请求的interface。

5.服务端比客户端多的是什么?
  1) AIDL中的interface 函数

  2) 实现类,实现aidl生成的抽象类(aidl编译生成的java)

  3) 还有一个service类。

6.服务端怎么赋值给客户端?

private ServiceConnection conn = new ServiceConnection() {

        // 断开连接时调用
@Override
public void onServiceDisconnected(ComponentName arg0) {
} // 连接时调用
@Override
public void onServiceConnected(ComponentName arg0, IBinder binder) {
iPerson = IPerson.Stub.asInterface(binder);
if (iPerson != null) {
try {
iPerson.setName("My name is 'Server AIDL'");
Toast.makeText(MainActivity.this, "赋值成功!",
Toast.LENGTH_LONG).show();
} catch (RemoteException e) {
e.printStackTrace();
Toast.makeText(MainActivity.this, "赋值失败!",
Toast.LENGTH_LONG).show();
}
}
}
};

7.这些IPerson的实现是什么?
与一般的实现抽象类一样。

public class PersonImpl extends IPerson.Stub {
private String name; @Override
public String getName() throws RemoteException {
return name;
} @Override
public void setName(String name) throws RemoteException {
this.name = name;
}
}

8. service是?
直接return那个实现类

public class MyService extends Service {
private Stub iPerson = new PersonImpl(); @Override
public IBinder onBind(Intent arg0) {
Log.i("service", "onBind...");
return iPerson;
} }

说明一下JNI 与AIDL的更多相关文章

  1. 手机APP开发:学JAVA转安卓APP开发是不是很容易?

    成都亿合云商小编为您分享:Android开发是以Java语言为基础的,Android 虽然使用Java 语言作为开发工具,但是在实际开发中发现,还是与Java SDK 有一些不同的地方.Android ...

  2. Java程序员转Android开发必读经验分享

    小编最近几日偷偷的发现部分Java程序员想转安卓开发,故此加紧补充知识,为大家搜集资料,积极整理前人的经验,希望可以给正处于困惑中的你,带来些许的帮助. 啰哩啰嗦的说说Java和Android程序的区 ...

  3. Android Gradle使用总结

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/77678577 本文出自[赵彦军的博客] 其他 Groovy 使用完全解析 http ...

  4. 年底Android面试整理(附答案)

    面试,无非都是问上面这些问题(挺多的 - -!),聘请中高级的安卓开发会往深的去问,并且会问一延伸二.以下我先提出几点重点,是面试官基本必问的问题,请一定要去了解! 基础知识 – 四大组件(生命周期, ...

  5. Android 面试题目汇总

    内容源自:2017-2018最新Android面试题 以下是几点重点,是面试官基本必问的问题,请一定要去了解! 基础知识 – 四大组件(生命周期,使用场景,如何启动) java基础 – 数据结构,线程 ...

  6. Android2017最新面试题(3-5年经验个人面试经历)

    2017最新Android面试题 大家好,在跟大家讲述自己的面试经历,以及遇到的面试题前,先说说几句题外话. 接触Android已经3年,在工作中遇到疑难问题总是在网上(csdn大牛博客,stacko ...

  7. Android基础——项目的文件结构(三)

    Android基础--项目的文件结构(三) 代码源文件夹与资源文件夹 [注]此项目文件结构仅限于Android Studio下的Android项目!!! 在一个Android项目中,代码源文件夹有4个 ...

  8. Android : App客户端与后台服务的AIDL通信以及后台服务的JNI接口实现

    一.APP客户端进程与后台服务进程的AIDL通信 AIDL(Android Interface definition language-“接口定义语言”) 是 Android 提供的一种进程间通信 ( ...

  9. Android之SDK、NDK、JNI和so文件

    1.     SDK Android SDK(AndroidSoftware Development Kit),即Android软件开发工具包,Android的SDK基于Java实现,这意味着基于An ...

随机推荐

  1. 浅谈 cookie 和 session

    1.关闭浏览器后,session是否还存在? session在服务器和客户端各保留一个副本,关闭浏览器与否和session是否存在没有任何关系. session采取的是服务器端保持状态的方案,它存储在 ...

  2. Android常见包

    Android.jar常见包 android.app-----------提供高层的程序模型.提供基本的运行环境android.content-------包含各种的对设备上的数据进行访问和发布的类a ...

  3. Android——Runtime类中的freeMemory,totalMemory,maxMemory等几个方法

    maxMemory() 这个方法返回的是java虚拟机(这个进程)能构从操作系统那里挖到的最大的内存,以字节为单位,如果在运行java程序的时 候,没有添加-Xmx参数,那么就是64兆,也就是说max ...

  4. jquery css快捷方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Loadrunner:场景中添加负载生成器

    场景中添加负载生成器: (1)远程机子(假设ip为192.168.134.23)开启负载生成器 开始菜单找到:LoadRunner Agent Process 开启后任务栏会显示如下图: (2)场景中 ...

  6. Java 编译报错:illegal character

    1.检查编译版本:1.5还是1.6 2.重新引用一下Jar包

  7. C++多态性——函数的覆盖和隐藏

    1.函数的覆盖 覆盖的条件: 基类函数必须是虚函数(使用Virtual关键字进行声明): 发生覆盖的两个函数必须分别位于派生类和基类中: 函数名称与参数列表必须完全一样: 2.函数的隐藏 隐藏,是指派 ...

  8. javaSE第一天

    第一天    2 1:计算机概述(了解)    2 (1)计算机    2 (2)计算机硬件    2 (3)计算机软件    2 (4)软件开发(理解)    2 (5)语言    2 (6)人机交 ...

  9. ASP.NET验证控件一

    为了更好地创建交互式Web应用程序.加强应用程序安全性,程序开发人员应该对用户输入的内容进行验证. ASP.NET提供了一系列输入验证控件,使用这些控件用户可以很方便地实现输入验证. ASP.NET还 ...

  10. 生成.a文件步骤

    1.新建一个Project 选择 iOS->Framework & Library ->Cocoa Touch Static Library点击Next-> 输入Produc ...