精华内容
下载资源
问答
  • 转自:http://www.ibm.com/developerworks/cn/java/jnimthds/ PDF链接:http://pan.baidu.c
  • 一个Native Method是这样一个java方法:该方法的实现由非java语言实现,好比C。这个特征并不是java所特有,不少其它的编程语言都有这一机制,好比在C++,你能够用extern "C"告知C++编译器去调用一个C的函数...

    一. 什么是Native Method

    简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,好比C。这个特征并不是java所特有,不少其它的编程语言都有这一机制,好比在C++中,你能够用extern "C"告知C++编译器去调用一个C的函数。

    "A native method is a Java method whose implementation is provided by non-java code."

    在定义一个native method时,并不提供实现体(有些像定义一个java interface),由于其实现体是由非java语言在外面实现的。,下面给了一个示例:

    public class IHaveNatives

    {

    native public void Native1( int x ) ;

    native static public long Native2() ;

    native synchronized private float Native3( Object o ) ;

    native void Native4( int[] ary ) throws Exception ;

    }

    这些方法的声明描述了一些非java代码在这些java代码里看起来像什么样子(view).

    标识符native能够与全部其它的java标识符连用,可是abstract除外。这是合理的,由于native暗示这些方法是有实现体的,只不过这些实现体是非java的,可是abstract却显然的指明这些方法无实现体。native与其它java标识符连用时,其意义同非Native Method并没有差异,好比native static代表这个方法能够在不产生类的实例时直接调用,这很是方便,好比当你想用一个native method去调用一个C的类库时。上面的第三个方法用到了native synchronized,JVM在进入这个方法的实现体以前会执行同步锁机制(就像java的多线程。)

    一个native method方法能够返回任何java类型,包括非基本类型,并且一样能够进行异常控制。这些方法的实现体能够制一个异常而且将其抛出,这一点与java的方法很是类似。当一个native method接收到一些非基本类型时如Object或一个整型数组时,这个方法能够访问这非些基本型的内部,可是这将使这个native方法依赖于你所访问的java类的实现。有一点要紧紧记住:咱们能够在一个native method的本地实现中访问全部的java特性,可是这要依赖于你所访问的java特性的实现,并且这样作远远不如在java语言中使用那些特性方便和容易。

    native method的存在并不会对其余类调用这些本地方法产生任何影响,实际上调用这些方法的其余类甚至不知道它所调用的是一个本地方法。JVM将控制调用本地方法的全部细节。须要注意当咱们将一个本地方法声明为final的状况。用java实现的方法体在被编译时可能会由于内联而产生效率上的提高。可是一个native final方法是否也能得到这样的好处倒是值得怀疑的,可是这只是一个代码优化方面的问题,对功能实现没有影响。

    若是一个含有本地方法的类被继承,子类会继承这个本地方法而且能够用java语言重写这个方法(这个彷佛看起来有些奇怪),一样的若是一个本地方法被fianl标识,它被继承后不能被重写。

    本地方法很是有用,由于它有效地扩充了jvm.事实上,咱们所写的java代码已经用到了本地方法,在sun的java的并发(多线程)的机制实现中,许多与操做系统的接触点都用到了本地方法,这使得java程序可以超越java运行时的界限。有了本地方法,java程序能够作任何应用层次的任务。

    二.为何要使用Native Method

    java使用起来很是方便,然而有些层次的任务用java实现起来不容易,或者咱们对程序的效率很在乎时,问题就来了。

    与java环境外交互:

    有时java应用须要与java外面的环境交互。这是本地方法存在的主要缘由,你能够想一想java须要与一些底层系统如操做系统或某些硬件交换信息时的状况。本地方法正是这样一种交流机制:它为咱们提供了一个很是简洁的接口,并且咱们无需去了解java应用以外的繁琐的细节。

    与操做系统交互:

    JVM支持着java语言自己和运行时库,它是java程序赖以生存的平台,它由一个解释器(解释字节码)和一些链接到本地代码的库组成。然而无论怎 样,它毕竟不是一个完整的系统,它常常依赖于一些底层(underneath在下面的)系统的支持。这些底层系统经常是强大的操做系统。经过使用本地方法,咱们得以用java实现了jre的与底层系统的交互,甚至JVM的一些部分就是用C写的,还有,若是咱们要使用一些java语言自己没有提供封装的操做系统的特性时,咱们也须要使用本地方法。

    Sun's Java

    Sun的解释器是用C实现的,这使得它能像一些普通的C同样与外部交互。jre大部分是用java实现的,它也经过一些本地方法与外界交互。例如:类java.lang.Thread 的 setPriority()方法是用java实现的,可是它实现调用的是该类里的本地方法setPriority0()。这个本地方法是用C实现的,并被植入JVM内部,在Windows 95的平台上,这个本地方法最终将调用Win32 SetPriority() API。这是一个本地方法的具体实现由JVM直接提供,更多的状况是本地方法由外部的动态连接库(external dynamic link library)提供,而后被JVM调用。

    三.JVM怎样使Native Method跑起来:

    咱们知道,当一个类第一次被使用到时,这个类的字节码会被加载到内存,而且只会回载一次。在这个被加载的字节码的入口维持着一个该类全部方法描述符的list,这些方法描述符包含这样一些信息:方法代码存于何处,它有哪些参数,方法的描述符(public之类)等等。

    若是一个方法描述符内有native,这个描述符块将有一个指向该方法的实现的指针。这些实如今一些DLL文件内,可是它们会被操做系统加载到java程序的地址空间。当一个带有本地方法的类被加载时,其相关的DLL并未被加载,所以指向方法实现的指针并不会被设置。当本地方法被调用以前,这些DLL才会被加载,这是经过调用java.system.loadLibrary()实现的。

    最后须要提示的是,使用本地方法是有开销的,它丧失了java的不少好处。若是别无选择,咱们能够选择使用本地方法。java

    展开全文
  • java常用方法大全

    万次阅读 多人点赞 2018-03-28 11:46:07
    Java中的鼠标和键盘事件 1、使用MouseListener借口处理鼠标事件 鼠标事件有5种:按下鼠标键,释放鼠标键,点击鼠标键,鼠标进入和鼠标退出 鼠标事件类型是MouseEvent,主要方法有: getX(),getY() 获取鼠标位置 ...

    字符串


    1、获取字符串的长度
    length()
    2 、判断字符串的前缀或后缀与已知字符串是否相同
    前缀 startsWith(String s)
    后缀 endsWith(String s)
    3、比较两个字符串
    equals(String s)
    4、把字符串转化为相应的数值
    int型 Integer.parseInt(字符串)
    long型 Long.parseLong(字符串)
    float型 Folat.valueOf(字符串).floatValue()
    double型 Double.valueOf(字符串).doubleValue()
    4、将数值转化为字符串
    valueOf(数值)
    5、字符串检索
    indexOf(Srting s) 从头开始检索
    indexOf(String s ,int startpoint) 从startpoint处开始检索
    如果没有检索到,将返回-1
    6、得到字符串的子字符串
    substring(int startpoint) 从startpoint处开始获取
    substring(int start,int end) 从start到end中间的字符
    7、替换字符串中的字符,去掉字符串前后空格
    replace(char old,char new) 用new替换old
    trim()
    8、分析字符串
    StringTokenizer(String s) 构造一个分析器,使用默认分隔字符(空格,换行,回车,Tab,进纸符)
    StringTokenizer(String s,String delim) delim是自己定义的分隔符
    nextToken() 逐个获取字符串中的语言符号
    boolean hasMoreTokens() 只要字符串还有语言符号将返回true,否则返回false
    countTokens() 得到一共有多少个语言符号


    文本框和文本区

    1、文本框
    TextField() 构造文本框,一个字符长
    TextField(int x) 构造文本框,x个字符长
    TextField(String s) 构造文本框,显示s
    setText(String s) 设置文本为s
    getText() 获取文本
    setEchoChar(char c) 设置显示字符为c
    setEditable(boolean) 设置文本框是否可以被修改
    addActionListener() 添加监视器
    removeActionListener() 移去监视器
    2、文本区
    TextArea() 构造文本区
    TextArea(String s) 构造文本区,显示s
    TextArea(String s,int x,int y) 构造文本区,x行,y列,显示s
    TextArea(int x,int y) 构造文本区,x行,y列
    TextArea(String s,int x,ing y,int scrollbar)
    scrollbar的值是:
    TextArea.SCROLLBARS_BOTH
    TextArea.SCROLLBARS_VERTICAL_ONLY
    TextArea.SCROLLBARS_HORIZONTAL_ONLY
    TextArea.SCROLLBARS_NONE
    setText(String s) 设置文本为s
    getText() 获取文本
    addTextListener() 添加监视器
    removeTextListener() 移去监视器
    insert(String s,int x) 在x处插入文本s
    replaceRange(String s,int x,int y) 用s替换从x到y处的文本
    append(String s) 在文本的最后追加文本s
    Int getCaretPosition(int n) 获取文本区中光标的位置


    按钮


    1、按钮
    Button() 构造按钮
    Button(String s) 构造按钮,标签是s
    setLabel(String s) 设置按钮标签是s
    getLabel() 获取按钮标签
    addActionListener() 添加监视器
    removeActionListener() 移去监视器

    标签

    1、标签
    Label() 构造标签
    Label(String s) 构造标签,显示s
    Label(String s,int x)
    x是对齐方式,取值:
    Label.LEFT
    Label.RIGHT
    Label.CENTER
    setText(String s) 设置文本s
    getText() 获取文本
    setBackground(Color c) 设置标签背景颜色
    setForeground(Color c) 设置字体颜色


    选择框

    1、选择框
    Checkbox() 构造选择框
    Checkbox(String s) 构造选择框,给定标题s
    Checkbox(String s,boolean b) b设定初始状态
    Checkbox(String s,boolean b,CheckboxGroup g) g设定了所属的组(有了组就成为单选框)
    addItemListener() 添加监视器
    removeItemListener() 移去监视器
    getState() 返回选择框的是否选中状态
    setState(boolean b) 设置选择框的状态
    getLabel() 获取选择框的标题
    setLabel(String s) 设置选择框的标题为s


    选择控件和滚动列表

    1、选择控件
    Choice() 构造选择控件
    add(String s) 向选择控件增加一个选项
    addItemListener() 添加监视器
    removeItemListener() 移去监视器
    getSelectedIndex() 返回当前选项的索引
    getSelectedItem() 返回当前选项的字符串代表
    insert(String s,int n) 在n处插入选项s
    remove(int n)
    removeAll()
    2、滚动列表
    List() 构造滚动列表
    List(int n) 参数n是可见行数
    List(int n,boolean b) 参数b是设置是否可以多项选择
    add(String s) 向列表的结尾增加一个选项
    add(String s,int n) 在n处增加一个选项
    AddActionListener() 滚动列表添加监视器
    addItemListener() 滚动列表上的选项添加监视器
    remove(int n) 删除n初的选项
    remnoveAll() 删除全部选项
    getSelectedIndex() 返回当前选项的索引
    getSelectedItem() 返回当前选项的字符串代表


    3、组件类的一些常用方法
    void setBackground(Color c) 设置组件背景颜色
    void setForeground(Color c) 设置组件前景颜色
    void setFonts(Font f) 设置组件字体
    void setBounds(int x,int y,int w,int h) 设置坐标,x,y表示在容器中坐标,w,h表示宽和高
    void setLocation(int x,int y) 移动到x,y 处
    void setSize(int w,int h) 设置宽和高
    void setVisible(boolean b) 设置组建是否可见
    int getBounds().wigth 获取宽
    int getBounds().height 获取高
    int getBounds().x 获取x 坐标
    int getBounds().y 获取y 坐标
    Toolkit getToolkit() 获取工具包对
    void setEnabled(boolean b) 设置是否可以使用(默认可以)

    窗口和菜单
    1、窗口
    Frame() 构造窗口
    Frame(String s) 窗口标题是s
    setBounds(int x,int y,int w,int h) 窗口位置x,y,宽w,高y
    setSize(int w,int h) 设置窗口位置(单位是像素)
    setBackground(Color c) 设置背景颜色
    setVisible(boolean b) 设置窗口是否可见
    pack() 窗口出现时紧凑
    setTitle(String s) 设置标题为s
    getTitle() 获取标题
    setResizable(boolean b) 设置窗口大小是否可以调整
    2、菜单条
    Menubar() 构造菜单条
    setMenubar() 窗口添加菜单条
    3、菜单
    Menu() 构造菜单
    Menu(String s) 构造菜单,标题s
    add
    add(MenuItem item) 菜单增加菜单选项item
    add(String s) 向菜单增加选项s
    getItem(int n) 获取n处的选项
    getItemCount() 获取选项数目
    insert(MenuItem item,int n) 在n处插入菜单选项item
    insert(String s,int n) 在n处插入菜单选项
    remove(int n) 删除菜单的n处的菜单选项
    removeAll() 删除全部
    4、菜单项
    MenuItem() 构造菜单项
    MenuItem(String s) 构造标题是s的菜单项
    setEnabled(boolean b) 设置是否可以被选择
    getLabel() 得到菜单选项名
    addActionListener() 添加监视器
    5、有关菜单的技巧
    addSeparator() 增加菜单分割线
    CheckboxMenuItem() 复选框菜单项
    setShortcut(MenuShortcut k) 设置快捷键(k取值KeyEvent.VK_A----KeyEvent.VK_Z)


    建立对话框
    1、Dialog类
    Dialog(Frame f,String s) 构造对话框,初始不可见,s是标题,f是对话框所依赖的窗口
    Dialog(Frame f,String s,boolean b) b设置初始是否可见
    getTitle() 获取对话框标题
    setTitle(String s) 设置对话框标题
    setModal(boolean b) 设置对话框模式
    setSize(int w,int h) 设置对话框大小
    setVisible(boolean b) 显示或隐藏对话框
    2、FileDialog类
    Filedialog(Frame f,String s,int mode) mode的值是fileDialog.LOAD或者fileDialog.SAVE
    public String getDirectory() 获取当前文件对话框中显示的文件所属目录
    public String getFile() 获取当前文件对话框中文件的字符串表示,不存在返回null

    Java中的鼠标和键盘事件
    1、使用MouseListener借口处理鼠标事件
    鼠标事件有5种:按下鼠标键,释放鼠标键,点击鼠标键,鼠标进入和鼠标退出
    鼠标事件类型是MouseEvent,主要方法有:
    getX(),getY() 获取鼠标位置
    getModifiers() 获取鼠标左键或者右键
    getClickCount() 获取鼠标被点击的次数
    getSource() 获取鼠标发生的事件源
    事件源获得监视器的方法是addMouseListener(),移去监视器的方法是removeMouseListener()
    处理事件源发生的时间的事件的接口是MouseListener 接口中有如下的方法
    mousePressed(MouseEvent) 负责处理鼠标按下事件
    mouseReleased(MouseEvent) 负责处理鼠标释放事件
    mouseEntered(MouseEvent) 负责处理鼠标进入容器事件
    mouseExited(MouseEvent) 负责处理鼠标离开事件
    mouseClicked(MouseEvent) 负责处理点击事件
    2、使用MouseMotionListener接口处理鼠标事件
    事件源发生的鼠标事件有2种:拖动鼠标和鼠标移动
    鼠标事件的类型是MouseEvent
    事件源获得监视器的方法是addMouseMotionListener()
    处理事件源发生的事件的接口是MouseMotionListener 接口中有如下的方法
    mouseDragged() 负责处理鼠标拖动事件
    mouseMoved() 负责处理鼠标移动事件
    3、控制鼠标的指针形状
    setCursor(Cursor.getPreddfinedCursor(Cursor.鼠标形状定义)) 鼠标形状定义见(书 P 210)
    4、键盘事件
    键盘事件源使用addKeyListener 方法获得监视器
    键盘事件的接口是KeyListener 接口中有3个方法
    public void keyPressed(KeyEvent e) 按下键盘按键
    public void keyReleased(KeyEvent e) 释放键盘按键
    public void keyTypde(KeyEvent e) 按下又释放键盘按键


    Java多线程机制
    1、Java的线程类与Runnable接口
    Thread类
    public Thread() 创建线程对象
    public Thread(Runnable target) target 称为被创建线程的目标对象,负责实现Runnable接口
    线程优先级
    Thread类有三个有关线程优先级的静态常量:MIN_PRIORITY,MAX_PRIORITY,NORM_PRIORITY
    新建线程将继承创建它的副相承的优先级,用户可以调用Thread类的setPriority(int a)来修改
    a的取值:
    Thread.MIN_PRIORITY,Thread.MAX_PRIORITY,Thread.NORM_PRIORITY
    主要方法
    启动线程 start()
    定义线程操作 run()
    使线程休眠 sleep()
    sleep(int millsecond) 以毫秒为单位的休眠时间
    sleep(int millsecond,int nanosecond) 以纳秒为单位的休眠时间
    currentThread() 判断谁在占用CPU的线程

    输入输出流
    1、FileInputStream类
    FileInputStream(String name) 使用给定的文件名name创建一个FileInputStream对象
    FileInputStream(File file) 使用File对象创建FileInpuStream对象
    File类有两个常用方法:
    File(String s) s确定文件名字
    File(String directory,String s) directory是文件目录
    例如:
    File f=new File("Myfile.dat");
    FileInputStream istream=new FileInputStream(f);
    处理I/O异常
    当出现I/O错误的时候,Java生成一个IOException(I/O异常)对象来表示这个错误的信号。
    程序必须使用一个catch检测这个异常
    例如:
    try{
    FileInputStream ins= new FileInputStream("Myfile.dat");
    }
    catch(IOException e){
    System.out.println("File read Error:"+e);
    }
    从输入流中读取字节
    int read() 返回0~255之间一个整数,如果到输入流末尾,则返回-1
    int read(byte b[]) 读取字节数组
    int read(byte b[],int off,int len) off指定把数据存放在b中什么地方,len指定读取的最大字节数
    关闭流
    close()
    2、FileOutputStream类
    FileOutputStream(String name) 使用指定的文件名name创建FileOutputStream对象
    FileOutputStream(File file)使用file对象创建FileOutputStream对象
    FileOutputStream(FileDescriptor fdobj)使用FileDescriptor对象创建FileOutputStream对象
    3、FileReader类和FileWriter类
    FileReader(String filename)
    FileWriter(String filename)
    处理时需要FileNotFoundException异常
    4、RandomAccessFile类
    RandomAccessFile不同于FileInputStream和FileOutputStream,不是他们的子类
    当我们想对一个文件进行读写操作的时候,创建一个指向该文件的RandomAccessFile流就可以了
    RandomAccessFile类有两个构造方法:
    RandomAccessFile(String name, String mode) name是文件名,mode取r(只读)或rw(读写)
    RandomAccessFile(File file,String mode) file给出创建流的源
    seek(long a) 移动RandomAccessFile流指向文件的指针,a确定指针距文件开头的位置
    getFilePointer() 获取当前文件的指针位置
    close() 关闭文件
    getFD() 获取文件的FileDescriptor
    length() 获取文件长度
    read() 读取一个字节数据
    readBoolean() 读取一个布尔值
    readByte() 读取一个字节
    readChar()
    readFloat()
    readFully(byte b[])
    readInt()
    readLine()
    readLong()
    readUnsignedShort()
    readUTF() 读取一个UTF字符串
    setLength(long newLength) 设置文件长度
    skipByte(int n) 在文件中跳过给定数量的字节
    write(byte b[]) 写b.length个字节到文件
    writeBoolean(bolean b)
    writeByte(int v)
    writeChar(char c)
    writeChars(String s)
    writeDouble(double d)
    writeFloat(float v)
    writeInt(int i)
    writeLong(long l)
    writeShort(int i)
    writeUTF(String s)
    5、管道流
    PipedInputStream类
    PipedInputStream() 创建一个管道输入流
    PipedInputStream(PipedOutputStream a)连接到输出流a的输入流
    read() 从输入流中读取一个字节
    read(byte b[],int off,int len) off是在b中的开始位置,len是字节长度
    PipedOutputStream类
    PipedOutputStream() 创建一个输出流
    PipedOutputStream(PipedInputStream a) 连接到输入流a的输出流
    write(int b)
    write(byte b[],int off,int len)
    counnect() 连接输入输出流
    close() 关闭流
    在使用的时候要捕获IOException异常。
    6、数据流
    DataInputStream类(数据输入流)
    DataInputStream(InputStream in) 将数据输入流指向一个由in指定的输入流
    DataOutputStream类(数据输出流)
    DataOutputStream(OutputStream out) 将数据输出流指向一个由out指定的输出流
    主要方法:
    close()
    read() 读取一个字节数据
    readBoolean() 读取一个布尔值
    readByte() 读取一个字节
    readChar()
    readFloat()
    readFully(byte b[])
    readInt()
    readLine()
    readLong()
    readUnsignedShort()
    readUTF() 读取一个UTF字符串
    skipByte(int n) 在文件中跳过给定数量的字节
    write(byte b[]) 写b.length个字节到文件
    writeBoolean(bolean b)
    writeByte(int v)
    writeChar(char c)
    writeChars(String s)
    writeDouble(double d)
    writeFloat(float v)
    writeInt(int i)
    writeLong(long l)
    writeShort(int i)
    writeUTF(String s)
    7、对象流
    ObjectInputStream类和ObjectOutputStream类分别是DataInputStream类和DataOutputStream类的子类
    8、回压输入流
    PushbackInputStream类
    PushbackInputStream(InputStream in)
    PushbackReader类
    PushbackReader(Reader in)
    unread(char c) 回压一个字符
    unread(char c[]) 回压数组c中全部字符
    unread(char c[],offset,int n) 回压c中从offset开始的n个字符

    java网络的基本知识
    1、使用URL(统一资源定位)
    例如:
    try
    {
    url=new URL("http://www.sina.com.cn");
    }
    catch(MalformedURLException e)
    {
    System.out.println("Bad URL:"+url);
    }
    在Applet 中链接向另外的Web页面,使用代码:
    getAppletContext().showDocument(url);
    2、套接字
    客户建立到服务器的套接字(Socket)
    Socket(String host,int port) host是服务器的IP地址,port是端口号
    建立了套接字后可以使用getInputStream()获得输入流
    还可以使用getOutputStream()获得一个输出流
    服务器建立接受客户套接字的服务器套接字(ServerSocket)
    ServerSocket(int port) port是端口号
    建立了套接字连接后可以使用accept()接收客户的套接字
    可以使用getOutputStream()获得一个输出流
    还可以使用getInputStream()获得一个输入流
    3、InetAddress类
    getByName(String )
    3、InetAddress类
    getByName(String s) 获取Internet上主机的地址
    getHostName() 获取InetAddress对象所包含的域名
    getHostAddress() 获取InetAddress对象所包含的IP地址
    getLocalHost() 获取本地地址
    4、UDP数据报
    发送数据包,即使用DatagramPacket类将数据打包,有两种构造方法
    DatagramPacket(byte data[],int length,InetAddress address,int port)
    ?含有data数组的数据
    ?该数据包将发送到地质是address,端口是port的主机上
    DatagramPacket(byte data[],int offset,int length,InetAddress address,int port)
    ?含有data数组的从offset开始,length长度的数据
    ?该数据包将发送到地质是address,端口是port的主机上
    接收数据包,即使用DatagramSocket(int port)创建一个对象,port必须和待接收的数据包的端口相同
    例如:
    如果发送方的数据包端口是5566
    DatagramSocket mail=new DatagramSocket(5566);
    然后对象mail可以使用方法receive(Datagrampacket pack)接收数据包
    在使用参数pack 接收数据包前,必须创建pack
    byte data[]=new byte[100];
    int length=90;
    DatagramPacket pack=new DatagramPataet(data,length);
    mail.receive(pack);
    该数据包pack将接收长度是length的数据放入data,注意数据长度不要超过8192KB
    pack还可以调用方法getPort()获取所接受数据包是从什么端口发出的
    调用方法InetAddress getAddress()可以获知数据包来自哪个主机


    Java与图像
    1、java支持的图像类型:GIF,JPEG,BMP
    2、Image类
    首先申请一个Image对象
    Image img =getImage(URL url,String name) url是图像地址,name是图片名称
    通常使用:
    Image img =getImage(getCodBase(),String name) getCodBase()获取当前小应用程序的URL,也就是在同一目录下
    图像被加载后,就可以在paint()中绘制了
    drawImage(Image img,int x,int y,ImageObserver observer)
    img是上面获取的图像, x,y是指定图像左上角的位置,observer是加载图像时的图像观察器
    Applet类已经实现了ImageObserver接口,所以可以直接使用this作为最后一个参数
    drawImage(Image img,int x,int y,int width,int height,ImageObserver observer)
    width和height是要绘制的图像的宽和高
    可以使用img.getHeight(this)和img.getWidth(this)来获取被加载的图像的宽和高
    3、设置Java窗口图标
    Frame对象可以使用setIconImage(Image img)方法设置左上角图标,默认图标是咖啡杯


    Java数据库连接(JDBC)
    1、JDBC-ODBC桥接器
    建立JDBC-ODBC桥接器
    try
    {
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    }
    catch(ClassNotFoundException e){}
    连接到数据库
    try
    {
    Connection con=DriverManager.getConnection("jdbcdbc:数据源名称","数据源的login name",
    "数据源的password");
    }
    catch(SQLException e){}
    向数据库发送SQL语句
    try
    {
    Statement sql=con.createStatement();
    }
    catch(SQLException e){}
    处理查询结果
    ResultSet rs=sql.executeQuery("SQL语句");
    第二十四章 Java与多媒体
    1、在小程序中播放声音
    java可以播放au,aiff,wav,midi,rfm格式的音频
    可以调用Applet的一个静态方法:
    newAudioClip(URL url,String name) url是地址,name是音频名称
    也可以用Applet类的实例方法:
    getAudioClip(URL url,String name)
    根据url地址和声音文件name,获得一个用于播放的音频对象,这对象可以使用下面的方法来处理声音:
    play() 播放声音文件name
    loop() 循环播放name
    stop() 停止播放name
    2、Java媒体框架(JMF)
    创建播放器
    try
    {
    URL url=new URL(getDocumenBase(),视频文件名称);
    player player=Manager.createPlayer(url);
    }
    catch(IOException e){}
    向播放器注册控制监视器
    player.addControllerListener(监视器);
    创建监视器必须使用接口ControllerListener ,该接口中的方法是
    public void controllerUpdate(ControllerEvent e)
    让播放器对媒体进行预提取
    player.prefetch()
    启动播放器
    player.start();
    停止播放器
    player.stop();
    停止播放器后必须释放内存中的资源
    player.deallocate();

    Java Swing基础
    1、Jcomponent类
    Jcomponent类是所有轻量组件的父类,主要的子类有:
    JButton 创建按钮对象,而且可以创建在图标的按钮
    JComboBox 创建组合框对象,和Choice相似
    JCheckBox 创建复选框对象
    JFileChooser 创建文件选择器
    JInternalFrame 创建内部窗体
    JLabel 创建标签
    JMenu 创建菜单对象
    JMenuBar 创建菜单条对象
    JMenuItem 创建菜单项对象
    JPanel 创建面板对象
    JPasswordField 创建口令文本对象
    JPopupMenu 创建弹出式菜单
    JProgressBar 创建进程条
    JRadioButton 创建单选按钮
    JScrollBar 创建滚动条
    JScrollPane 创建滚动窗格
    JSlider 创建滚动条
    JSplitPane 创建拆分窗格
    JTable 创建表格
    JTextArea 创建文本区
    JTexPane 创建文本窗格
    JToolBar 创建工具条
    JToolTip 创建工具提示对象
    JTree 创建树对象
    2、JFrame类
    JFrame类及其子类创建的对象是窗体
    (1)JFrame类及其子类创建的窗体是swing窗体
    (2)不可以把组件直接加到swing窗体中,应该把组件加到内容面板中
    (3)不能为swing窗体设置布局,而应当为内容面板设置布局
    (4)swing窗体通过调用getContentPane()方法得到它的内容面板
    3、JApplet类
    (1)不可以把组件直接添加到小程序容器中,也应该添加到内容面板中
    (2)不能为小程序设置布局
    (3)小程序容器通过调用getContenPane()方法得到内容面板
    4、JDialog类
    (1)不可以把组件直接添加到对话框容器中,也应该添加到内容面板中
    (2)不能为对话框设置布局
    (3)对话框容器通过调用getContenPane()方法得到内容面板
    5、JPanel面板
    JPanel()
    JPanel(布局对象)
    6、滚动窗口JScrollPane
    JScrollPane()
    JScrollPane(component c)
    7、拆分窗口JSplitPane
    JSplitPane(int a,Component b,Component c)
    a的取值是HORIZONTAL_SPLIT或者VERTICAL_SPLIT决定水平拆分还是垂直拆分
    JSplitPane(int a,boolean b ,Component b,Component c) b的取值决定拆分线移动的时候组件是否连续变化
    8、内部窗体JInternalFrame
    JInternalFrame(String title,boolean resizable,booleam closable,boolean max,boolean min)
    参数的意义分别是窗口名称,是否能调整大小,是否有关闭按钮,最大化按钮,最小化按钮
    (1)不能把组件直接加到窗体中,而是加到内容面板中
    (2)必须先把内部窗体加到一个容器中(JDesktopPane),该容器是专门为内部窗体服务的
    9、按钮(JButton)
    JButton() 创建按钮
    JButton(String s) s是按钮的名字
    JButton(Icon icon) icon是按钮上的图标
    JButton(String s,Icon icon)
    getText() 获取按钮名字
    getIcon() 获取按钮图标
    setIcon(Icon icon) 设置按钮图标
    setHorizontalTextposition(int a) a确定按钮上图标的位置,取值:
    AbstractButton_CENTR,AbstractButton_LEFT,AbstractButton_RIGHT
    setVerticalTextposition(int a) a确定按钮上名字相对图标的位置,取值:
    AbstractButton.TOP,AbstractButton.BOTTOM,AbstractButton.CENTR
    setMnemonic(char c) 设置按钮的键盘操作方式是字符c(Alt+c)
    setEnabled(boolean b) b决定按钮是否可以被单击

    展开全文
  • java 本地方法

    万次阅读 2017-11-18 18:29:24
    暂无

    暂无

     

    展开全文
  •  编写包含本地方法Java类(Eclipse)package test; public class Example { public native void set(String info); public native String get(); }2. 生成javah文件(Eclipse)(1)点击eclipse工具栏外部工具...

    传统做法

    1.  编写包含本地方法的Java类(Eclipse)

    package test;
    
    public class Example {
    	public native void set(String info);
    	public native String get();
    }

    2. 生成javah文件(Eclipse)

    (1)点击eclipse工具栏外部工具按钮,打开配置外部工具;

    (2)选中program右键点击添加;

    (3)配置如下信息后点击run,生成的test_Example.h文件在项目的jni目录下。

    name框里输入命令的名字:javah

    location框里输入javah.exe的绝对路径: D:\jdk1.8\bin\javah.exe

    Working Directory框里输入:${project_loc}

    Arguments框里输入: -v-classpath "${project_loc}/bin" -d "${project_loc}/jni"-jni ${java_type_name}


    3. 创建dll项目(Visual Studio)

    (1)vs下新建DLL项目,将test_Example.h和jni.h(包含JAVA_HOME/include/jni.h和JAVA_HOME/include/win32/jni_md.h)添加进工程。


    (2)新建dlltest.cpp实现test_Example.h的C++函数

    #include <iostream>
    #include "opencv2/highgui/highgui.hpp"
    #include "test_Example.h"
    
    std::string s = "hello dll";
    
    std::string jstring2str(JNIEnv* env, jstring jstr) {   
        char* rtn = NULL;   
        jclass clsstring = env->FindClass("java/lang/String");   
        jstring strencode = env->NewStringUTF("GB2312");   
        jmethodID mid = env->GetMethodID(clsstring,   "getBytes",   "(Ljava/lang/String;)[B");   
        jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr,mid,strencode);   
        jsize alen = env->GetArrayLength(barr);   
        jbyte* ba = env->GetByteArrayElements(barr,JNI_FALSE);   
        if(alen > 0)   
        {   
            rtn = (char*)malloc(alen+1);         
            memcpy(rtn,ba,alen);   
            rtn[alen]=0;   
        }   
        env->ReleaseByteArrayElements(barr,ba,0);   
        std::string stemp(rtn);
        free(rtn);
        return stemp;   
    }
    
    jstring charTojstring(JNIEnv* env, const char* pat) {
        //定义java String类 strClass
        jclass strClass = (env)->FindClass("Ljava/lang/String;");
        //获取String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String
        jmethodID ctorID = (env)->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
        //建立byte数组
        jbyteArray bytes = (env)->NewByteArray(strlen(pat));
        //将char* 转换为byte数组
        (env)->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*) pat);
        // 设置String, 保存语言类型,用于byte数组转换至String时的参数
        jstring encoding = (env)->NewStringUTF("GB2312");
        //将byte数组转换为java String,并输出
        return (jstring) (env)->NewObject(strClass, ctorID, bytes, encoding);
    }
    
    JNIEXPORT void JNICALL Java_test_Example_set
    	(JNIEnv* env, jobject obj, jstring str) {
    	s = jstring2str(env,str);
    	std::cout<<s<<std::endl;
    }
    
    JNIEXPORT jstring JNICALL Java_test_Example_get
    	(JNIEnv* env, jobject obj) {
    	return charTojstring(env,s.c_str());
    }

    (3)编译,生成dll文件

            


    4. 在java中使用调用本地方法(Eclipse)

    编写测试类,并将dlltest.dll文件放在classpath下。

    package test;
    
    public class Test {
    
    	static {
    		System.load("E:\\workspace\\test\\src\\dlltest.dll");
    	}
    	public static void main(String[] args) {
    		Example e = new Example();
    		System.out.println(e.get());
    		e.set("hello java");
    	}
    }

    运行结果:

    hello dll

    hello java

    5.  常见错误

    (1)找不到对应的dll,原因很可能是不在classpath下,使用绝对路径试试;

    (2)dll的64位版本和Eclipse的32位版本的不一致错误;

    (3)web下找不到dll可参考:http://blog.csdn.net/l1028386804/article/details/53903557

    模仿Object中的registerNatives()方法

    除了使用传统方法实现JNI外,也可以使用RegisterNatives实现JNI。和传统方法相比,使用RegisterNatives的好处有三点:
    (1)C++中函数命名自由,不必像javah自动生成的函数声明那样,拘泥特定的命名方式;
    (2)效率高。传统方式下,Java类调用本地函数时,通常是依靠VM去动态寻找.so中的本地函数(因此它们才需要特定规则的命名格式),而使用RegisterNatives将本地函数向VM进行登记,可以让其更有效率的找到函数
    (3)运行时动态调整本地函数与Java函数值之间的映射关系,只需要多次调用RegisterNatives()方法,并传入不同的映射表参数即可。

    为了使用RegisterNatives,我们需要了解JNI_OnLoad和JNI_OnUnload函数。JNI_OnLoad()函数在VM执行System.loadLibrary(xxx)函数时被调用,它有两个重要的作用:(1)指定JNI版本:告诉VM该组件使用那一个JNI版本(若未提供JNI_OnLoad()函数,VM会默认该使用最老的JNI 1.1版),如果要使用新版本的JNI,例如JNI 1.4版,则必须由JNI_OnLoad()函数返回常量JNI_VERSION_1_4(该常量定义在jni.h中) 来告知VM。(2)初始化设定,当VM执行到System.loadLibrary()函数时,会立即先呼叫JNI_OnLoad()方法,因此在该方法中进行各种资源的初始化操作最为恰当,RegisterNatives也在这里进行。JNI_OnUnload()当VM释放该组件时被调用,JNI_OnUnload()函数的作用与JNI_OnLoad()对应,因此在该方法中进行善后清理,资源释放的动作最为合适。

    相比传统方式,vs项目下有所不同。只需在dll项目下声明本地方法,并重载jni.h中的JNI_ONLOAD方法来注册本地方法

    1. 声明本地方法

    static JNINativeMethod methods[] = {  
    	{"get", "()Ljava/lang/String;", reinterpret_cast<void*>(get)},
    	{"set", "(Ljava/lang/String;)V", reinterpret_cast<void*>(set)}
    }; 

    其中JNINativeMethod是jni.h中定义的结构体

    /*
     * used in RegisterNatives to describe native method name, signature,
     * and function pointer.
     */
    typedef struct {
        char *name;
        char *signature;
        void *fnPtr;
    } JNINativeMethod;

    name是java中定义的native函数的名字,fnPtr是函数指针,也就是C++中java native函数的实现。signature是java native函数的签名,可以认为是参数和返回值。native函数签名参考下表,其实也可对照生成的javah文件中的注释复制就行。

    字符javaC/C++类型
    Vvoidvoid
    Zjbooleanboolean
    Ijintint
    Jjlonglong
    Djdoubledouble
    Fjfloatfloat
    Bjbytebyte
    Cjcharchar
    Sjshortshort
    数组则以"["开始,用两个字符表示,比如int数组表示为[I,以此类推。
    如果参数是Java类,则以"L"开头,以";"结尾,中间是用"/"隔开包及类名,例如Ljava/lang/String;,而其对应的C++函数的参数为jobject,一个例外是String类,它对应C++类型jstring。

    为了与JNINativeMethod的函数名对应,简化native方法名,同时应修改javah的函数声明:

    JNIEXPORT void JNICALL set(JNIEnv *, jobject, jstring);
    JNIEXPORT jstring JNICALL get (JNIEnv *, jobject);

    2. 重载jni.h中的JNI_Onload方法,注册native方法

    jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)  
    {  
     JNIEnv* env = NULL;  
       if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK)  
       {  
          return JNI_ERR;  
       }  
      
     jclass cls = env->FindClass("test/Example");  
       if (cls == NULL)  
       {  
          return JNI_ERR;  
       }  
      
       int len = sizeof(methods) / sizeof(methods[0]);  
       if (env->RegisterNatives(cls, methods, len) < 0)  
       {  
          return JNI_ERR;  
       }  
      
       return JNI_VERSION_1_4;  
    }

    3.  编译dll项目,生成dll文件

    生成dll后与前面的用法完全一样。


    更多内容请参考:https://www.jianshu.com/p/216a41352fd8

    http://blog.csdn.net/qiuxiaolong007/article/details/7860610

    展开全文
  • 比较常用的Jar包,maven比较常用的Jar包不用从中央仓库下载。节省时间
  • 版权声明:本文为博主原创文章,转载请注明CSDN...JAVA常见关键字及JDK 常用方法源码分析(持续更新...) 一、JAVA常见关键字 1、this   1)、常用于指向当前类对象本身(指向当前对象的本身),具体实现代码如下:...
  • Java本地缓存

    千次阅读 2019-07-06 22:19:25
    在计算,缓存是一个高速数据存储层,其中存储了数据子集,且通常是短暂性存储,这样日后再次请求此数据时,速度要比访问数据的主存位置快。通过缓存,您可以高效地重用之前检索或计算的数据。 为什么要用缓存 ...
  • java的System类常用方法

    千次阅读 2018-03-16 16:40:54
    -------------------------java的System类常用方法-------------------java.lang 类 Systemjava.lang.Object java.lang.Systempublic final class Systemextends ObjectSystem 类包含一些有用的类字段和方法。...
  • java中常用的几个集合类

    万次阅读 多人点赞 2019-06-10 20:19:24
    //包含Collection(集合),List,Set,Map(图),以及其Iterator,Comparator,Cloneable,还有常用的具体实现类 //List<List<String>>集合的嵌套使用 //1、是否允许空 //2、是否允许重复数据 //3、...
  • 宋波李晋李妙妍张悦 宋波李晋李妙妍张悦 * 宋波李晋李妙妍张悦 Java程序...宋波李晋李妙妍张悦 * 15.1 网络相关知识 Java为用户提供了完善的网络功能 获取网络上的各种资源 与服务器建立连接和通信 传递本地数据 这些功
  • java 常用api

    2017-05-25 16:59:50
    spring,mybatis,hibernate,springMvc,jquery1.8,think in Java第五版,还有本地测试借口的方法的小公举wsCaller等等。
  • JVM-01Java内存区域与内存溢出异常(上)【运行时区域数据】 JVM-02内存区域与内存溢出异常()【hotspot虚拟机对象】 JVM-03内存区域与内存溢出异常(下)【OutOfMemoryError案例】 运行时数据区总览 字节码文件被...
  • java中常用的缓存框架

    千次阅读 2019-10-10 23:05:04
    阅读文本大概需要3分钟。0x01:Ehcache Ehcache是一个Java实现的开源分布式缓存框架,EhCache可以有效地减轻数据库的负载,可以让数据保存在不同服...
  • 1. java获取某个文件夹的路径怎么写File类有两个常用方法可以得到文件路径一个是:getCanonicalPath(),另一个是:getAbsolutePath(),可以通过File类的实例调用这两个方法例如file.getAbsolutePath()其中file是File...
  • 实现 Java 本地缓存,该从这几点开始

    千次阅读 多人点赞 2019-09-11 09:11:17
    缓存,我相信大家对它一定不陌生,在项目,缓存肯定是必不可少的。市面上有非常多的缓存工具,比如 Redis、Guava Cache 或者 EHcache。对于这些工具,我想大家肯定都非常熟悉,所以今天我们不聊它们,我们来聊一聊...
  • Java 十大常用框架

    千次阅读 2019-07-16 07:50:14
    十大常用框架: 一、SpringMVC 二、Spring 三、Mybatis 四、Dubbo 五、Maven 六、RabbitMQ 七、Log4j 八、Ehcache 九、Redis 十、Shiro 延展阅读: 一、SpringMVC Spring Web MVC是一种基于Java的实现...
  • Java后端常用环境本地搭建(当前包括dubbo注册中心、zookeeper客户端、node前端服务器、前端常用框架vue)
  • 比较常用java中间件都有哪些?一起来了解一下吧。一、什么是java中间件?首先的话,我们要来介绍一下究竟什么是java中间件。随着Javaweb开发的演进和进化,在面对消息系统、数据库、服务化接口的抽象等等涉及数据...
  • 主要介绍了java执行windows下cmd命令的方法,较为详细的说明了Java执行Windows下CMD命令的方法,并总结了常用的CMD命令供大家参考,需要的朋友可以参考下
  • java的命名方法

    千次阅读 2021-02-12 12:48:24
    1. JAVA源文件的命名 JAVA源文件名必须和源文件所定义的类的类名相同。2. Package的命名 Package名的第一部分应是小写ASCII字符,并且是顶级域名之一,通常是com、edu、gov、mil、net、org或由ISO标准3166、1981...
  • Java常用缓存组件和方法

    千次阅读 2016-08-01 19:47:37
    在我们系统开发,有许多关于性能提升方面的组件,这里介绍并总结一下; 缓冲(Buffer) 缓冲区是一块特定的内存区域。开辟缓冲区的目的是通过缓解应用程序上下层之间的差异,提高系统的性能。在日常生活,缓冲的一...
  • Java开发常用服务端口整理

    万次阅读 2020-12-14 10:26:44
    Java开发常用服务端口整理 序号 服务 端口号 1 http/Nginx 80 2 https 443 3 ssh/scp 22 10 FTP 21 4 DNS 53 5 SMTP 25 5 Telnet 23 6 MySQL 3306 7 Oracle 1521 8 Tomcat 8080 9 Redis...
  • 目前 Java 语言的版本很多,除了常用Java 8,有一些遗留项目可能使用了 Java 7,也可能有一些比较新的的项目使用了 Java 10 以上的版本。如果想切换自己本地Java 开发环境,折腾起来还是需要花费一些时间的,...
  • Java 获取本地IP地址和主机名

    千次阅读 2020-06-13 14:56:12
    【菜鸟教程】直接通过 java.net.InetAddress类获取,如下: import java.net.InetAddress; public class Main { public static void main(String[] args) throws Exception { InetAddress addr = ...
  • Java系统中常用日志框架

    万次阅读 多人点赞 2019-06-03 17:17:50
    文章目录日志介绍日志概念日志作用Java中常用日志框架Java常用日志框架之间的关系日志门面框架日志实现框架 日志介绍 日志概念 日志:在计算机领域,日志文件(logfile)是一个记录了发生在运行的操作系统或其他...
  • Linux下JAVA常用命令大全

    千次阅读 2019-01-19 14:54:14
    Web应用一般都部署在Linux服务器上,所以也就需要懂一些Linux常用命令。以前每学到一个新的命令,有时候不常用就忘记了,特此来总结一些命令来支持部署应用使用。 基本命令 cd /home #进入home目录 ls #列出当前...
  • JAVA 常用开发快捷键大全

    千次阅读 2017-07-11 15:15:35
    JAVA 开发快捷键大全
  • Java十大常用框架介绍

    万次阅读 多人点赞 2018-09-01 23:57:33
    1、透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。 2、软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。 3、 服务自动注册与发现,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 279,725
精华内容 111,890
关键字:

java常用的本地方法

java 订阅