• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > 说明一下JNI 与AIDL,说明JNIAIDL

说明一下JNI 与AIDL,说明JNIAIDL

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了jni,jni是什么,android jni,jni教程,jni开发等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

说明一下JNI 与AIDL,说明JNIAIDL


代码在评论中。

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;
    }

}

 

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 关于jni编译32位、64位动态库(Android.mk和Application.mk文件),jniapplication.mk
  • NDK-JNI实战教程(二) JNI官方中文资料,ndk-jnijni
  • Android Studio上面使用Ndk JNI 开发工程
  • Android Studio 2.0下创建jni应用调用本地C函数
  • Android Studio 1.5.1 JNI 编程
  • 关于JNI的使用方法,JNI使用方法
  • 向android studio中导入带有jni的eclipse项目
  • 说明一下JNI 与AIDL,说明JNIAIDL

相关文章

  • 2017-05-26Your project path contains non-ASCII characters,containsnon-ascii
  • 2017-05-26Android Bottom Sheet详解
  • 2017-05-26Android ListView onItemClick Not Work,androidonitemclick
  • 2017-05-26安卓6.0(棉花糖)新特性汇总,安卓6.0
  • 2017-05-26文件缓存(配合JSON数组),缓存配合json数组
  • 2017-05-26自定义图片轮播框架。也是作为依赖库使用的哦,自定义框架
  • 2017-05-26AlertDialog创建6种对话框的用法
  • 2017-05-26Android ViewPager使用详解
  • 2017-05-26手机安全卫士——缓存清理,安全卫士缓存清理
  • 2017-05-26Application,applicationform

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android Studio导入Eclipse项目的两种方法,androideclipse
    • Android必知必会-获取视频文件的截图、缩略图
    • Android开发:内存机制分析——堆和栈
    • Android微信支付SDK开发,android支付sdk
    • Android体系结构,android体系结构介绍
    • svn环境搭建(不同目录、设置不同的权限)
    • FlatBuffers初探,flatbuffers
    • android TextView 设置字体大小,androidtextview
    • Android 缓存类LruCache源码分析
    • 获取LayoutInflater对象的方法和inflate方法的一些参数问题,inflater.inflate参数

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有