java代码生成器能生成c语言代码吗?用什么方法能实现呢?

作者&投稿:紫欧 (若有异议请与网页底部的电邮联系)
如何用java 或C语言代码怎么实现如下功能:~

要在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
/* 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
#include "HelloNative.h"

JNIEXPORT void JNICALL Java_HelloNative_sayHello(JNIEnv *, jobject)
{
printf("Hello World!
");
}

代码编写完成之后,我们再用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:
" + 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!"了

Java Native Interface(JNI)是Java语言的本地编程接口,是J2SDK的一部分。在java程序中,我们可以通过JNI实现一些用java语言不便实现的功能。通常有以下几种情况我们需要使用JNI来实现。 标准的java类库没有提供你的应用程序所需要的功能,通常这些功能是平台相关的 你希望使用一些已经有的类库或者应用程序,而他们并非用java语言编写的 程序的某些部分对速度要求比较苛刻,你选择用汇编或者c语言来实现并在java语言中调用他们 下面我们开始编写HelloWorld程序,由于涉及到要编写c/c++代码因此我们会在开发中使用Microsoft VC++工具。编写java代码,我们在硬盘上建立一个hello目录作为我们的工作目录,首先我们需要编写自己的java代码,在java代码中我们会声明native方法,代码非常简单。如下所示 class HelloWorld { public native void displayHelloWorld(); static { System.loadLibrary("hello"); } public static void main(String[] args) { new HelloWorld().displayHelloWorld(); } } 注意我们的displayHelloWorld()方法的声明,它有一个关键字native,表明这个方法使用java以外的语言实现。方法不包括实现,因为我们要用c/c++语言实现它。注意System.loadLibrary("hello")这句代码,它是在静态初始化块中定义的,系统用来装载hello共享库,这就是我们在后面生成的hello.dll(如果在其他的操作系统可能是其他的形式,比如hello.so) 编译java代码 javac HelloWorld.java 生成HelloWorld.class文件 创建.h文件 这一步中我们要使用javah命令生成.h文件,这个文件要在后面的c/c++代码中用到,我们运行 javah HelloWorld。这样我们可以看到在相同目录下生成了一个HelloWorld.h文件,文件内容如下 在此我们不对他进行太多的解释。 /* DO NOT EDIT THIS FILE - it is machine generated */ #include /* Header for class HelloWorld */ #ifndef _Included_HelloWorld #define _Included_HelloWorld #ifdef __cplusplus extern "C" { #endif /* * Class: HelloWorld * Method: displayHelloWorld * Signature: ()V */ JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif 编写本地实现代码 在这部分我们要用C/C++语言实现java中定义的方法,我们在VC++中新建一个Project,然后创建一个HelloWorldImp.cpp文件,内容如下 #include #include "HelloWorld.h" #include JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) { printf("Hello world!
"); return; } 注意我们这里include了 jni.h和刚才得到的HelloWorld.h文件。因此你要在VC++里面设置好,jni.h在JAVA_HOME/include里面。编译通过后再生成hello.dll文件。 运行java程序 把上面生成的hello.dll文件复制到我们的工作目录,这时候我们的目录中包括HelloWorld.java,HelloWorld.class和hello.dll文件。运行java HelloWorld命令,则可在控制台看到Hello world| 的输出了。运行VC++; 文件---新建---选“win32 console application”(控制台程序)---在右方设置好路径并输入工程名---确定 接下来的几个提示框点确定就行了,那是提示是否要用VC++提供的框架之类的 在左边的工作空间中选“FILEVIEW”标签项,点开“+”号,右键点击“SOURCE FILES”,选“添加文件到目录”,此即添加你要建立的C++源程序文件,会提示你没有文件,是否添加,你点是,输入文件名保存就OK了 然后SOURCE FILES下就出现了你刚才建立的*.CPP文件,双击,输入代码. 以下就是点”组建”菜单中的”编译”、”组建”等命令进行调试了。 相信你会了。 http://hi.baidu.com/%C7%E9%D4%B5and%D3%D1%D2%EA/blog/item/34084645e8560f23cefca3b7.html

按照我的理解,可以的,代码生成器是跨平台,而且是跨语言的(至少是跨文本语言的,UML暂时不好说,)。
代码生成器作为一种开发工具,一般不直接作为程序的一部分,通常也不直接或间接(如通过AOP)被程序调用,他是通过编程的方式生成所需要的代码,然后将生成的代码作为源文件,复制到开发工具的代码区,然后进行编译。由于代码生成器是在编译之前运行的,因此它可以跨语言,你不但可以用代码生成器生成高级语言,也可以生成汇编语言,甚至机器码(0、1代码)。
但编写代码生成器是一个难点,它需要你了解目标编程语言的语法。如果别人已经把你需要的代码生成器写好了,你只需按要求使用即可,此时就不需要了解目标编程语言的语法。
JNI是通过Java调用C语言(或其他语言,一般是C),它的实现机制与代码生成器不同(JNI是通过代码调用实现功能,而代码生成器是生成代码,复制代码进行使用),由于C是底层语言,一些底层操作单靠Java无法实现,所以才需要JNI。
以上是我对代码生成器的个人理解,虽然提问时间已过了很久,但依然希望能对你及其他网友有所帮助。

按照我的理解,不能,我也学习过java,没听过这个功能。高级语言最终都要编译成机器语言,也就是01串,为什么会有这么多的计算机语音,就是因为各自在各自的领域比较方便。实现同一个功能,不管什么语言都是可以的,只是难易程度的问题,因为任何语言都会有顺序、选择、循环这三种结构,如果可以的话,除非有一种这样的程序,可以把java编译的程序,也就是机器码反编译为C,这个我至今也没听说过,也不知道有什么用。就我的理解来说,反编译是非常难的一件事,而且是反编译为原来的语言,比如微软Windows源代码,绝对的商业机密,应该有很多人尝试过,你能拿到Windows的光盘(算是机器码吧),但是你并不能提供Windows的源代码,如果有人能提供的话,微软就会倒闭,反编译为其他语言,估计更是难上加难。

不能的,JAVA 与 C差不多!你发上来看看有人帮你搞的!

代码生成器就是根据特定的要求制定格式,灵活输出在项目中重复要用到的代码,节省项目时间,现在免费的代码生成器codesmith我经常用的,小玩意,不花钱



web开发工具都有哪些?
Web开发也可以理解为B\/S(Brouser\/Server)开发,是一种基于浏览器载体的框架,包含前端、后端和数据库三个大的方向,各个方向的技术都不一样,对应的开发工具也是不一样的。下面链出可以供参考web开发工具的一些介绍 web开发工具 Web前端开发技术包括三个要素:HTML、CSS和JavaScript,当然还有很多高级的...

ava的大方向是什么
7.JavaServlet:Servlet是一种小型的Java程序,它扩展了Web服务器的功能。作为一种服务器端的应用,当被请求时开始执行,这和CGIPerl脚本很相似。Servlet提供的功能大多与JSP类似,不过实现的方式不同。JSP通常是大多数HTML代码中嵌入少量的Java代码,而servlets全部由Java写成并且生成HTML。8.XML(Extensible...

在手机游戏开发中为什么要学习JAYA语言?
推荐阅读《福州手机游戏制作难吗》 5、解释运行,高效率:Java程序经编译器编译,生成的字节码经过了精心设计,它运行速度较快,克服了以往解释性语言运行效率低的缺点。 6、丰富的API文档和类库:Java开发工具包中的类库包罗万象,应有尽有,并为用户提供了详尽的API文档说明。 7、动态执行:ava执行代...

active X 是什么,作用是什么?
目录服务是在DCOM(Distributed COM,分布式COM)的周围,提供目录服务层,这样使远程对象在网络上能相互搜索。Web服务以Inter net信息服务器为中心进行构筑,它为服务器上的Web应用开发,提供脚本生成(Scripting )机构。网络服务以DCOM为中心进行构筑,通过以同步MS-RPC为中介的网络,使之能够连接控件。 Active Client是一种...

请问web开发工具都有哪些?
11.文本和代码编辑器 文本和代码编辑器不仅能够为开发者带来良好的代码体验,而且能够大大节约网站开发的时间。比较常用的编辑器有Atom,Notepad++,Vim等。之前,笔者也发过程序员票选最佳的代码编辑器,感兴趣的朋友可以戳进去看一下。12.灵感 对于很多工种来说,灵感都是极为重要的,但是灵感是可遇不...

一个Java源程序一般是由哪三个基本部分组成的?
一个简单的java程序由java包(如:import java.awt.*)、类声明 、变量、构造方法(可缺省)、方法 这几部分构成。java程序中至少要有一个类被声明为public。

JAVA动态代理设计原理及如何实现
每个实例都会关联一个InvocationHandler(调用处理器对象),在代理类实例上调用其代理接口中声明的方法时,最终都会由InvocationHandler的invoke方法执行;java.lang.Object中有三个方法也同样会被分派到调用处理器的 invoke 方法执行,它们是 hashCode,equals 和 toString;代码示例 最后以一个简单的动态代理例子...

安霸发布N1系列生成式AI芯片,支持前端设备运行本地LLM应用
它不仅是AI加速器,更是系统功能的全能手,能够处理多模态大模型,并在安防视频、机器人控制和AI助手等场景中展现其威力。通过运行大语言模型和多模态处理,设备端可以实现智能安防搜索、自然语言命令控制的机器人操作,以及代码、文本和图像的生成等多元化功能。这些系统得益于设备前端的生成式AI处理,提升了...

各种编程语言的主要用途
CGI CGI(common Gateway Interface,公共网关接口)。CGI是信息服务器主机对外信息服务的标准接口,为了向客户端提供动态信息而制定。通过专门编写CGI脚本程序(在CGI控制下运行得程序,通常称为CGI程序),不仅可以生成静态的内容,而且可以生成完全无法预见的 动态的内容!比如雅虎、搜狐等搜索引擎提供的强大搜索...

编程都有哪些语言?
目前而言,C语言主要用来开发底层模块(比如驱动、解码器、算法实现),服务应用(比如web服务器)和嵌入式应用(比如微波炉里的程序)。C++也可以做这些,不过由于C++的复杂性和标准问题,人们还是更愿意使用C来做。4.JavaScript:JavaScript是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言。听起来好像...

南川区13260546218: java可以编写c语言编译器吗 -
产促永瑞: 可以的,c也可以写java的

南川区13260546218: Java如何调用C语言代码 ? -
产促永瑞: 要在java中调用c语言的库,需要使用Java提供了JNI. 举例说明 在c语言中定义一个 void sayHello()函数(打印Hello World);然后在Java中调用这个函数显示Hello Word. 现在分别从Java和C语言两部分说明: 1. Java 部分 首先定义一个...

南川区13260546218: Java程序怎么转换成C语言 -
产促永瑞: 使用词法分析可以简单的进行转换,不过问题是接口,java使用的库类和函数,c并不一定拥有,而且java运行的方式不同(java可以说是解释器的脚本,而c最终变成指令集),并不是简单给出一个函数调用位置就可以解决的,目前的话可以实现个转化器(如果学过编译原理),但前提是不使用接口,或许我们可以像编译器对string类型的支持那样实现所有java的库操作,但这显然是鸡肋,因为这种方法写的java程序转换后是很难移植的(显然我是说硬件厂商不会为你天真的想法提供接口),并且对c风格来说是一种极大的破坏,最后生成的代码既没有效率也没有可移植性和可读性.

南川区13260546218: java如何内嵌c代码? -
产促永瑞: 首选,直接内嵌是没法编译通过的.一般通过jni方式调用c或者c++,或者c最后生成可移植性文件,通过java的api直接调用命令行.

南川区13260546218: ida pro生成类c语言代码的怎么操作 -
产促永瑞: 就是伪代码,也就是就是用常规语言或文字符号(即非编程语言写的)代码算法,叫伪代码 只是为了直观的表达出算法,才用伪代码,还有相应的伪代码语言等,这些代码无法运行,只有通过按照伪代码所表达的算法或操作,编好程序,才能运行.

南川区13260546218: 怎么用Java生成128C编码 -
产促永瑞: 原来是要转化成unicode啊,试试下面这个方法: public static String toUnicode(String strText) throws UnsupportedEncodingException { char c; String strRet = ""; int intAsc; String strHex; for (int i = 0; i < strText.length(); i++) { c = strText.charAt(i); ...

南川区13260546218: Java核心技术第八版(2)中Java调用C函数JNI的例子,通过javah生成C语言头文件中有一段代码意思不懂 -
产促永瑞: JNICALL表示调用约定,相当于C++的stdcall,说明调用的是本地方法 JNIEXPORT表示函数的链接方式,当程序执行的时候从本地库文件中找函数

南川区13260546218: 有没有好用的代码编辑器,能编写C/C++,JAVA,C#的? -
产促永瑞: 微软已经出了Visual Stdio2013,可以编写C、C++、C#,eclipse可以编写Java.具体安装步骤直接点下一步,不过C盘内存空间不够,可以修改路径,装到其他盘

南川区13260546218: jcreator 如何快速生成代码? -
产促永瑞: 1: jcreator预定义的快捷键 输入try 然后直接按tab键,就会出现:try{}catch(Exception ex){}如果输入out , 然后按tab 键,就会出现System.out.println("");其它的依次类推即可2: jcreator 自定义快捷键jcreator提供自定义快捷键,让使用者更加...

南川区13260546218: 写一段java代码,调用c程序,都有什么办法 -
产促永瑞: JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能.解决JAVA对本地操作的一种方法就是JNI. JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网