要在java中调用c语言的库,需要使用Java提供了JNI。
举例说明
在c语言中定义一个 void sayHello()函数(打印Hello World);然后在Java中调用这个函数显示Hello Word.
现在分别从Java和C语言两部分说明:
1. Java 部分
首先定义一个HelloNative,在其中申明sayHello函数,函数要申明为Native 类型的.如下:
public class HelloNative {
public native void sayHello();
}
编译这个类,生成class文件:
javac HelloWorld.java
利用javah生成需要的h文件
javah HelloNative
生成的 h文件大概如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloNative */
#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloNative
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloNative_sayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
可以看一下上面自动生成的程序,程序include了jni.h,这个头文件在 $JAVA_HOME下的include文件夹下. 还可以发现生成的函数名是在之前的函数名前面加上了Java_HelloNative。
2. C语言部分
根据上面生成的h文件编写相应的代码实现,建立一个 HelloNative.cpp用来实现显示Hello World的函数.如下:
#include <stdio.h>
#include "HelloNative.h"
JNIEXPORT void JNICALL Java_HelloNative_sayHello(JNIEnv *, jobject)
{
printf("Hello World!\n");
}
代码编写完成之后,我们再用gcc编译成库文件,命令如下;
gcc -fPIC -I/usr/lib/jvm/java-7-openjdk-i386/include -I/usr/lib/jvm/java-7-openjdk-i386/include/linux -shared -o libHelloNative.so HelloNative.cpp
这样就会在当前目录下生成一个libHelloNative.so的库文件.这时需要的库已经生成,在C语言下的工作已经完成了.
接下来需要在Java中编写一个程序测试一下.在程序前,需要将我们的库载入进去.载入的方法是调用Java的 System.loadLibrary("HelloNative");
public class TestNative
{
static {
try {
System.loadLibrary("HelloNative");
}
catch(UnsatisfiedLinkError e) {
System.out.println( "Cannot load hello library:\n " + e.toString() );
}
}
public static void main(String[] args) {
HelloNative test = new HelloNative();
test.sayHello();
}
}
但是再编译后,运行的时候,问题又出现了.
Cannot load hello library:
java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path
Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloNative.sayHello()V
at HelloNative.sayHello(Native Method)
at TestNative.main(TestNative.java:13)
载入库失败,但是库明明就是放在当前文件夹下的,怎么会载入失败呢?
用System.getProperty("java.library.path")查看,发现java.library.path中并不u存在当前的目录.主要有以下的几个解决办法:
1) 将生成的库复制到java.library.path有的路径中去,当然这样不是很好
2) 设置环境变量export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ,将当前的目录加入到LD_LIBRARY_PATH中
3) 设置java 的选项,将当前的目录加入到其中 .java -Djava.library.path=. $LD_LIBRARY_PATH
这样之后程序就能够成功的运行了.可以看见显示的"Hello World!"了
㈡ 用服务器做在线编译器
如果是针对传统使用方法的编程语言实现一个的话涉及的内容很杂,包括:
Web服务器+Web服务器与后端程序交互的组件(这个可以用现成的,我用的是nginx+FCGI)
后端程序
后端核心就是一个类似调用系统给的类似execl的API执行一下对应编译工具,用这个API时还得精心处理一下管道,把输出内容导出来显示回网页。
但是因为这类程序和OJ一样,是网络上的公共服务而且居然还允许用户上传代码编译执行,所以问题主要集中在安全处理上,而且安全问题的处理高度依赖操作系统。
以Linux为例,安全方面包括但不仅包括以下内容:
依赖环境构建、沙盒
运行身份,包括GID、UID
资源限制,包括socket、文件操作、核心转储大小、文件数、子进程数等等
syscall限制
执行时间限制,包括运行时间和CPU时间
文件系统压力
Windows下是另一堆问题要解决,比Linux复杂得多(也许是我不太会用Windows)。
我认识一人,自己实现了一个类似Haskell的东西,有和Go Playground差不多的在线运行网页,我问他怎么那么快把那么多东西都搞完了,他说,“整个语言就是用JS实现的,所以有浏览器就能运行,不需要后端”,这也是一种思路。
天互数据
㈢ 网站在线编辑是干什么的
网站编辑工作就是添加网站内容,网站现有内容编辑,高级些的是负责某一大型网站一频道,含网站风格编辑,网站主题炒作等等.
各种站运营方式及对人才要求不同,你可以注册一个MJ来了解清楚.
㈣ 能实现输入函数的C/C++在线编译器
我认为目前最好用的在线编译器; http://www.mcqyy.com/RunCode/cpp/
㈤ 除了leetcode还有哪些在线编译
在线编辑器有很多。比较好的有FCK 有各个语言版本。还有个国产的webeditor。这两个是比较好的。也最常用的。但是配置相对比较麻烦。还有一些杂牌的在线编辑器。都不是太好用。如果没有特殊的要求。推荐你两个好的。一个是网易的编辑器。简单明了。常用功能都有。另一个是新浪编辑器。界面比较漂亮。功能扩展相当容易。
㈥ 能在网上在线编译C语言,并编译呈现出来的网站是什么
http://acm.h.e.cn/
㈦ 在线编译是否利用了模式识别
主要我们实验室没有和其他领域相结合的课题,比如医学图像处理、遥感图像处理、农业信息化、生物信息学等等,只能做做理论,要是做应用只能做做通用型的应用,比如人脸识别等等,不过感觉这个好像不太容易创新了,做的人太多了。 工作很高端,比...
㈧ 有哪些好用的在线 LaTeX 编译器
vim -- 强大的编码功能,加亮之类的只是小意思了。如果会配置的话,还可以实现自动补齐代码、自动编译、自动刷新浏览器之类的功能。会用 vi 或 vim 的话,强烈推荐,否则就算了。操作系统:Unix/Linux, Windows, MacOS, ...
emacs -- 没好好用过。编写其他代码时,它和 vim 一样强大,相信编写 LaTeX 文档也一样强。emacs 和 vi (现已被 vim 取代) 是 Unix 用户的两大神器,一般人只能驾驭其中一个,牛人才能两个都精通。
WinEdt --- 集成环境,有编码窗口,有编译按钮。由于 CTeX 的原因,在国内的 Windows 平台上十分流行。其实比较起来就是花哨一点而已,真正要看谁更快、功能更丰富的话,WinEdt 比 vim 和 emacs 差一大截。它的好处是上手快。vim 和 emacs 不练上几个月是驾驭不了的(不过 vim 和 emacs 现在都有窗口版,借助于鼠标也容易上手,但是快捷性就牺牲了)。操作系统:Windows,收费软件。如果安装 CTeX 的话,它会自动给你一个免费的 WinEdt.
Kile -- 类似于 WinEdt 的集成环境。但 WinEdt 是通用的开发集成环境,Kile 是专门针对 LaTeX 的集成开发环境,所以,要比 WinEdt 更好。操作系统:Linux
Scientifc WorkPlace -- 所见即所想 (WYSIWYM) 软件。Windows 用。收费软件。
Lyx -- WYSIWYM 软件,Linux, Windows, MacOS 都支持。
TeXmacs -- WYSIWYM 软件,Linux/Unix, Windows, MacOS 都支持。旧版本对中文支持不好,新版本不知道。
Windows 系统中的记事本、写字板也可以用,但是功能太低下。
㈨ java在线编译器实现
try{
Thread.sleep(1000);
}catch(InterruptedException e){
//扑捉发生在线程中的异常,当一个正在执行的线程被中断时就会出现这个异常,添加catch后当程序被双击停止时不会出现错误
e.printStackTrace();
}
lbClock.setText(getDate());
}
㈩ 在线编译好用吗,有什么好处
SageMathCloud
这个是Sage(一个志在超越MATLAB、Mathematica、Maple的数学软件)在线使用站点,同时也支持LaTeX文档的书写、编译、预览及查看,最方便的是原生提供了SageTeX的支持,绘制函数图像更方便,数学运算在文档内直接完成。