如何在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不需要union,如果你想改变类型的话,那么声明一个Object类型不就就行了,但是个人觉得这样很麻烦,你用的时候还要转型,如果转型错误会抛出异常

C语言可以用一个指针值指向内存的任何一个空间,当然有很多非法的空间会被检测出来,所有乱用指针,编译器或者系统就会报错。
但JAVA不同,JAVA 通过一个引用,来指向内存的一个空间,换句话说,不是你想指向哪里,就指向哪里,因为你定义个变量时,这个空间由系统分配,同样,你定义一个引用,这个空间同样由系统分配,而我们做的事情只是将这两个由系统分配的空间进行一个指向关联,没有一个随心所欲的内存指向
区别很明显吧,我相信这样解释,连一个没有任何C基础的人都能明白,呵呵,因为这是我第一次做任务来答题,所以详细一点,也啰嗦一点,如果还不明白,我们可以进一步交流。

从占用内存上看,c语言的联合体共用同一块内存,应该与Java中的单例很类似。联合体映射为单例类应该能够解决你的问题。

用类, 只有这样。
class DateE{
long ul[2];
int ui[4];
byte uc[8];

//get/set方法

}

java没有 unsigned long,如果数很大就换成BigDecimal
,或 BigInteger

用java调用C程序实现,百度一下,你就知道!

会用hibernate框架吗?可以采用级联操作


JAVA异常处理的意义何在??为什么要做异常处理,作用是什么??
代替日渐衰落的error code方法的新法,提供error code所未能具体的优势。异常处理分离了接收和处理错误代码。这个功能理清了编程者的思绪,也帮助代码增强了可读性,方便了维护者的阅读和理解。异常处理(又称为错误处理)功能提供了处理程序运行时出现的任何意外或异常情况的方法。异常处理使用try、catch 和 ...

java中,synchronized 的使用?
synchronized 是同步的意识,第一种是同步方法,就是只能在同时有一个线程操作这个方法,第二种synchronized(this){ read();update();} 是同步块,

用JAVA语句在控制台输入(石头)1 (剪刀)2 (布)3 统计你赢了多少次(次数...
刚刚没考虑到胜利的判断规则,现在补上,不好意思哦 ---代码--- package com.hx.baidu;import java.util.Random;import java.util.Scanner;\/ 项目名称 :JavaGame_March 文件名称 :ShitouJiandao.java 所在包 :com.hx.baidu 功能描述 :用JAVA语句在控制台输入(石头)1 (剪刀)2 (布)3 统计你...

求解,死活理解不了java面向对象的意思。。。
举个简单的例子,简单计算器,这个应该所有Java的书都有教吧:(下面是伪代码)1.一般写法:\/\/读取第一个数a...\/\/读取运算符号x...\/\/读取第二个数b...\/\/计算结果resultif (x.equals("+")){ ...}else if (x.equals("-")){ ...}else if ...\/\/END2.面向对象写法:(这里对于...

请问,Java中,单例设计模式是个什么意思,优势何在。
java的学习建议:首先要看书读理论,不一定都懂,因为有一个懂的过程;然后就是分析代码,看看书上的代码的意思,逐行逐行地看,去体会;最重要的一点就是敲写代码,刚开始不会没关系,照着书一行一行的敲,然后运行,观察结果,把程序运行结果联系程序代码,学得多一点了就尝试修改代码,改一点点看...

java里什么时候用返回值什么时候用输出语句?
根据情况需要,需要返回值的时候就用public String talk(){},不需要返回值的时候用public void talk(){},他们都是方法,没有什么本质的区别。比如说你做2个数字的运算,结果是需要返回的。你就输出一个数字,就不需要返回值啦!

Java编程思想(第4版)的作品目录
1.10 对象的创建和生命期1.11 异常处理:处理错误1.12 并发编程1.13 Java与Internet1.13.1 Web是什么1.13.2 客户端编程1.13.3 服务器端编程1.22 总结第2章 一切都是对象2.1 用引用操纵对象2.2 必须由你创建所有对象2.2.1 存储到什么地方2.2.2 特例:基本类型2.2.3 Java中的数组2...

一段最基础的java代码,一些基础问题
你首先初始化Ball类的时候,传入了radius, name两个变量;因为你的Ball类中的定义了两个私有成员:private double radius;private string name;this.radius = radius;this.name = name;这两句就是将你传入的数据保存到类中的两个私有成员 因为radius、name两个的名字和类中的私有成员的名字相同,所以要...

关于Java中的JavaMail问题
给你个例子吧 \/ author EX-QINCIDONG001 验证 \/ public class MailAuthorization extends Authenticator { private String username;private String password;public MailAuthorization(String username,String password) { this.username = username;this.password = password;} Override protected Password...

为什么日本IT行业java最好就业?java优势何在?
1、Java对初学者很友好:肯定能找到初学习时比Java简单的语言。首先是Python,这是一种语法简洁易懂的语言。然而,在现实世界中,更多任务用Java比用Python更容易解决。Java很容易学,因为Java是相对高级的语言。这意味着你不必像对待低级语言那样进行深入研究。例如,与C++不同,在Java中,垃圾回收(即...

宜春市19174117950: 如何在java中实现c语言中的联合的功能??? -
冻浅彼赛: 用类, 只有这样.class DateE{ long ul[2]; int ui[4]; byte uc[8];//get/set方法 } java没有 unsigned long,如果数很大就换成BigDecimal ,或 BigInteger

宜春市19174117950: 求教下c语言中的结构体如何在java中如何实现 -
冻浅彼赛: Java并不像c语言一样定义了结构体的语法形式,取而代之的是类,声明一个类,里面包含很多属性,也就是相当于结构体中多种变量类型的功能.

宜春市19174117950: C语言中的结构体和共同体在java中该怎么表示? -
冻浅彼赛: java中只有类没有结构,如果需要可以建一个类用,共同体(联合)?java5才可以支持枚举,java还不支持共同体

宜春市19174117950: delphi 如何实现c语言中的联合?
冻浅彼赛: 可以的.你看一下下面这段话(转载自 Essential Pascal):记录类型中允许包含variant 域,它表示多个域能公用同一内存区,而且域可以是不同类型(这相应于C语言中的联合union).换句话说,你可以通过variant 域或说是一组域访问记录中...

宜春市19174117950: 在JAVA和C++中怎么实现程序与界面的连接 -
冻浅彼赛: ctrl+w,加入成员变量,连接编辑框要用比方说:GetDlgItemText(IDC_TEXT, m_text);这类函数 建议去买本书如零基础学vc++,我也是自己慢慢啃的,不知道的百度谷歌.

宜春市19174117950: Java如何调用C语言代码 ? -
冻浅彼赛: 要在java中调用c语言的库,需要使用Java提供了JNI. 举例说明 在c语言中定义一个 void sayHello()函数(打印Hello World);然后在Java中调用这个函数显示Hello Word. 现在分别从Java和C语言两部分说明: 1. Java 部分 首先定义一个...

宜春市19174117950: 如何实现Java调用C或C++函数 -
冻浅彼赛: 在现今的软件开发领域中,Java以其跨平台的优势得到大量的应用,其代码可以一次编译多处执行.但这种特性给Java带来了一定的局限性,幸好Java提供了完备的C/C++语言接口,这样可以利用C语言的强大功能实现Java难以实现的功能,在...

宜春市19174117950: java如何实现c++中的引用"&"? -
冻浅彼赛: java中基本类型 是值传递 swap函数没办法实现.不过可以用传入一个int[2]去做,int a,int b是没办法实现的

宜春市19174117950: 如何在C++中嵌入JAVA程序 -
冻浅彼赛: 简单回答:据我所知,在当前应该办不到.相关知识:1、当前的JAVA,运行机制是调用JAVA支持环境提供的功能调用.它不是真正的二进制机器码.可以说,它的运行过程是基于边解释边运行的.所以,从运行效率与速度上去体验与感受,...

宜春市19174117950: 请问 java中 如何实现 c和c++语言中的 EOF功能??????
冻浅彼赛: 如果字节流的话,读取到了-1说明到了文件尾. int i=a.read(); while(i!=-1){ //继续读取 i=a.read(); } 对于读取字符流的话,如果到了文件尾则返回null String i=a.readLine(); while(i!=null){ //继续读取 i=a.readLine(); }

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