当前位置: 首页 > news >正文

张家港网站建设公司天气预报网站开发

张家港网站建设公司,天气预报网站开发,网站建设费用摊销多少年,网站做的不好使我们知道Java本身的实现,很大一部分是用C写的。实际上,Java也允许我们和原生平台的代码进行交互。 Java定义了一个接口规范,就叫做Java Native Interface,通过这个接口规范,我们就可以让Java代码运行原生平台的代码。…

我们知道Java本身的实现,很大一部分是用C++写的。实际上,Java也允许我们和原生平台的代码进行交互。

Java定义了一个接口规范,就叫做Java Native Interface,通过这个接口规范,我们就可以让Java代码运行原生平台的代码。

首先写一个Java的Class1:

public class HelloJNI {static {System.loadLibrary("hello"); // Load native library at runtime// hello.dll (Windows) or libhello.so (Unixes)}// Declare a native method sayHello() that receives nothing and returns voidprivate native void sayHello();// Test Driverpublic static void main(String[] args) {new HelloJNI().sayHello();  // invoke the native method}
}

从上面的代码,我们看到一些平常写Java代码的时候不常看见的东西,首先是这个:

 System.loadLibrary("hello");

这个System.loadLibrary方法可以用来调用平台的原生库。然后是这个:

private native void sayHello();

这个native关键字意味着这个代码的实现是原生平台实现,而不是Java代码。因此我们要做一个hello库,提供这个sayHello方法。

接下来我们用javah命令生成.h文件:

$ ls HelloJNI.java
HelloJNI.java
$ javah HelloJNI
$ ls *.h
HelloJNI.h

我们得到了HelloJNI.h文件,它的内容是根据HelloJNI.java生成的,我们看看里面的内容:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/** Class:     HelloJNI* Method:    sayHello* Signature: ()V*/
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *, jobject);#ifdef __cplusplus
}
#endif
#endif

可以看到上面的文件里自动生成了JNI接口规范的一些约定代码。比如jni.h这个是由JDK提供的,我们稍后要引用。还有sayHello对应的C/C++的方法是Java_HelloJNI_sayHello,这个命名方式可以看出来是Java_ClassName_MethodName,这个也是JNI的约定。

接下来我们写一个HelloJNI.c来实现这个HelloJNI.h

#include <jni.h>
#include <stdio.h>
#include "HelloJNI.h"// Implementation of native method sayHello() of HelloJNI class
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {printf("Hello World!\n");return;
}

这个代码就非常简单,就是实现了Java_HelloJNI_sayHello,功能就是printf("Hello World!\n");。我们编译这个代码:

$ c++ -c -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/darwin" HelloJNI.c

注意我是在MacOS上编译,所以引用的是MacOS的JDK的include目录,此外MacOS的内核名叫darwin,你如果用Linux系统,你的JDK的include目录里应该有一个linux目录,对应上面的darwin目录。

这两个-I主要是为了引用JNI相关的库文件:

$ ls $JAVA_HOME/include/jni*
/Library/Java/JavaVirtualMachines/jdk1.8.0_66.jdk/Contents/Home/include/jni.h
$ ls $JAVA_HOME/include/darwin/jni*
/Library/Java/JavaVirtualMachines/jdk1.8.0_66.jdk/Contents/Home/include/darwin/jni_md.h

这两个.h文件是必须的。编译完成后,我们就得到了object文件:

$ ls *.o
HelloJNI.o

nm命令看一下这个object file里面的符号:

$ nm HelloJNI.o
0000000000000000 T _Java_HelloJNI_sayHelloU _printf

可以看到包含的的methods。我们要把这个object文件链接成library,在MacOS下命令如下:

$ c++ -dynamiclib -o libhello.jnilib HelloJNI.o

这样我们就得到了Java可以调用的libhello.jnilib

$ ls *.jnilib
libhello.jnilib

我们在Java代码里写的是System.loadLibrary("hello"),但是这里的library名字叫做libhello,前面多了lib,这是一种命名约定。

如果你在Linux系统下,生成library的命令不太一样,需要用下面的命令生成.so文件,也就是shared library文件:

cc -shared -fpic -o libhello.so -I/usr/java/include -I/usr/java/include/linux HelloJNI.c

接下来就是编译Java代码:

$ javac HelloJNI.java

我们得到class文件:

$ ls *.class
HelloJNI.class

此时目录里应该有我们的library还有class文件:

$ ls *.class *.jnilib
HelloJNI.class  libhello.jnilib

此时我们可以使用java命令运行HelloJNI.class

$ java HelloJNI
Hello World!

可以看到我们这个Hello World!字符串是来自于native method的Java_HelloJNI_sayHello里面的printf。我们的Java代码与原生平台进行了交互。

参考资料:

  1. https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.htm

http://www.yayakq.cn/news/403546/

相关文章:

  • 成品网站nike源码1688常州网架生产厂家
  • 制作网站参考案例网站制作公司都还赚钱吗
  • 南京代做网站网站 如何做 中英文切换
  • 个人网站设计内容和要求做学校法人年度报告的网站
  • asp网站 上传空间中国营销传播网网址
  • 通辽建设公司网站sem推广软件哪家好
  • 织梦建设手机网站银川市建设诚信平台网站
  • 江苏工信部网站备案查询天津卓信软件开发有限公司
  • 做网站的协议书和计划书少儿编程加盟费一般多少钱
  • 网站备案后怎么做简单的响应式网页实例
  • 六安网站定制智慧团建注册登记入口
  • 个人房产信息查询网站电商运营主要做什么工作
  • 网站顶部动画代码点餐网站怎么做
  • 模仿网站页面违法吗app开发的价值
  • 如何把自己做的网站放到微信上flash网站的优缺点
  • 鄂尔多斯做网站的公司做网站流量点击分析的软件
  • 杭州互联网网站公司wordpress主题wordstar
  • 网站建设陆金手指科捷11徐州市建设工程交易网
  • 射阳做网站的公司在哪治疗男科一般花费多少钱
  • 网站被攻击了怎么办劳务公司怎么注册需要什么要求
  • 仁寿建设局网站旅游平台网站合作建设方案
  • 亚马逊的网站建设简历网免费
  • 网站建设app杭州制作一个自己的网站
  • 别人不能注册我的wordpress站成都个人团队网站开发
  • 网站备案 更名网站服务器端口设置
  • wp可以做商城网站吗wordpress 慢
  • 网站管理系统设置wordpress 回复给某人
  • 做正规小说网站有哪些手机上干点啥能挣零花钱
  • 岳阳网站设计改版北京网站建设最新消息
  • 我要用新浪云做网站免费模板网站word