社区
Java SE
帖子详情
如何在 java中调用 c函数~!
arlalei
2005-07-14 06:31:05
如何在 java中调用 c函数~!
操作系统是 solaries~
...全文
255
12
打赏
收藏
如何在 java中调用 c函数~!
如何在 java中调用 c函数~! 操作系统是 solaries~
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
laughsmile
2005-07-15
打赏
举报
回复
jni.h在jdk\include\
你最好在jdk\bin目录进行编译
arlalei
2005-07-15
打赏
举报
回复
to qyflaoda(调整心态):
能不能说清楚点呀~~
jdk难道不在 系统路径下吗?
我应该怎么做呢~?
qyflaoda
2005-07-15
打赏
举报
回复
jni.h在jdk下
arlalei
2005-07-15
打赏
举报
回复
多谢各位~ 编译通过了~
可是执行的时候 又出错了~
请问 如何 配置 java.library.path 属性~!!!???
laughsmile
2005-07-14
打赏
举报
回复
摘录于Think in java
A.1.1 调用固有方法
我们先从一个简单的例子开始:一个Java程序调用固有方法,后者再调用Win32的API函数MessageBox(),显示出一个图形化的文本框。这个例子稍后也会与J/Direct一志使用。若您的平台不是Win32,只需将包含了下述内容的C头:
#include <windows.h>
替换成:
#include <stdio.h>
并将对MessageBox()的调用换成调用printf()即可。
第一步是写出对固有方法及它的自变量进行声明的Java代码:
class ShowMsgBox {
public static void main(String [] args) {
ShowMsgBox app = new ShowMsgBox();
app.ShowMessage("Generated with JNI");
}
private native void ShowMessage(String msg);
static {
System.loadLibrary("MsgImpl");
}
}
在固有方法声明的后面,跟随有一个static代码块,它会调用System.loadLibrary()(可在任何时候调用它,但这样做更恰当)System.loadLibrary()将一个DLL载入内存,并建立同它的链接。DLL必须位于您的系统路径,或者在包含了Java类文件的目录中。根据具体的平台,JVM会自动添加适当的文件扩展名。
C头文件生成器:javah
现在编译您的Java源文件,并对编译出来的.class文件运行javah。javah是在1.0版里提供的,但由于我们要使用Java 1.1 JNI,所以必须指定-jni参数:
javah -jni ShowMsgBox
javah会读入类文件,并为每个固有方法声明在C或C++头文件里生成一个函数原型。下面是输出结果——ShowMsgBox.h源文件(为符合本书的要求,稍微进行了一下修改):
/* DO NOT EDIT THIS FILE
- it is machine generated */
#include <jni.h>
/* Header for class ShowMsgBox */
#ifndef _Included_ShowMsgBox
#define _Included_ShowMsgBox
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: ShowMsgBox
* Method: ShowMessage
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL
Java_ShowMsgBox_ShowMessage
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
从“#ifdef_cplusplus”这个预处理引导命令可以看出,该文件既可由C编译器编译,亦可由C++编译器编译。第一个#include命令包括jni.h——一个头文件,作用之一是定义在文件其余部分用到的类型;JNIEXPORT和JNICALL是一些宏,它们进行了适当的扩充,以便与那些不同平台专用的引导命令配合;JNIEnv,jobject以及jstring则是JNI数据类型定义。
此时,我们要做的全部事情就是写一个C或C++源文件,在其中包含由javah生成的头文件;并实现固有方法;然后编译它,生成一个动态链接库。这一部分的工作是与平台有关的,所以我假定读者已经知道如何创建一个DLL。通过调用一个Win32 API,下面的代码实现了固有方法。随后,它会编译和链接到一个名为MsgImpl.dll的文件里:
#include <windows.h>
#include "ShowMsgBox.h"
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD dwReason, void** lpReserved) {
return TRUE;
}
JNIEXPORT void JNICALL
Java_ShowMsgBox_ShowMessage(JNIEnv * jEnv,
jobject this, jstring jMsg) {
const char * msg;
msg = (*jEnv)->GetStringUTFChars(jEnv, jMsg,0);
MessageBox(HWND_DESKTOP, msg,
"Thinking in Java: JNI",
MB_OK | MB_ICONEXCLAMATION);
(*jEnv)->ReleaseStringUTFChars(jEnv, jMsg,msg);
}
若对Win32没有兴趣,只需跳过MessageBox()调用;最有趣的部分是它周围的代码。传递到固有方法内部的自变量是返回Java的大门。第一个自变量是类型JNIEnv的,其中包含了回调JVM需要的所有挂钩(下一节再详细讲述)。由于方法的类型不同,第二个自变量也有自己不同的含义。对于象上例那样的非static方法(也叫作实例方法),第二个自变量等价于C++的“this”指针,并类似于Java的“this”:都引用了调用固有方法的那个对象。对于static方法,它是对特定Class对象的一个引用,方法就是在那个Class对象里实现的。
剩余的自变量代表传递到固有方法调用里的Java对象。主类型也是以这种形式传递的,但它们进行的“按值”传递。
arlalei
2005-07-14
打赏
举报
回复
哎。。 得回家了, 明天再来顶~!!!
arlalei
2005-07-14
打赏
举报
回复
再顶~!!!
arlalei
2005-07-14
打赏
举报
回复
谢谢各位~~
按照网上的一个例子, 我做了如下实验
首先,
写了一个 java类 testdll.java
//////////////////////
public class testdll
{
static
{
System.out.println("Load");
System.loadLibrary("libtest");
}
public native static int get();
public native static void set(int i);
public static void main(String[] args)
{
testdll test = new testdll();
test.set(10);
System.out.println(test.get());
System.out.println("End");
}
}
////////////////////////////////////
然后执行 javac testdll.java命令, 生成testdll.class文件;
接着执行 javah testdll 命令 ,生成 testdll.h 文件
接着我写了c文件 test.c
//////////////////////////////////
#include <stdio.h>
#include "testdll.h"
JNIEXPORT jint JNICALL Java_testdll_get
(JNIEnv * a, jclass j)
{
printf("Hello,Maggie!\n");
return 0;
}
JNIEXPORT void JNICALL Java_testdll_set
(JNIEnv * b, jclass i, jint j)
{
printf("Hello,Maggie! set\n");
}
////////////////////////////////////
问题出在 下一步,
当我执行 cc test.c -shared -fPIC -o libtest.so 命令时,错误发生;
错误信息如下:
/usr/local/include/jni.h:17:31: gcj/libgcj-config.h: No such file or directory
test.c:14:2: warning: no newline at end of file
好像是说 找不到 jni.h
希望大家都来帮帮忙啊, 这个问题很着急~~ ~~~
congliu
2005-07-14
打赏
举报
回复
http://www.pconline.com.cn/pcedu/empolder/gj/java/0506/642328.html
jixingzhong
2005-07-14
打赏
举报
回复
使用JNI
在论坛这里看看吧
应该有相关的知识!
qyflaoda
2005-07-14
打赏
举报
回复
肯定是使用JNI了,搂主可以自己去查,网上很多例子的
如http://www.pconline.com.cn/pcedu/empolder/gj/java/0506/642328.html
arlalei
2005-07-14
打赏
举报
回复
自己先顶~!
java
语言方法
调用
C语言
函数
在
java
中
调用
C语言的
函数
,对初学者很不错的实例! 在
java
中
调用
C语言的
函数
,对初学者很不错的实例!
在
java
中
调用
C的
函数
的类库支持
在
java
中
调用
C的
函数
的类库支持,如果想在
java
中
使用C的
函数
,就用这个了。
java
调用
C语言编写的so库
中
的
函数
,
java
调用
C语言编写的dll库
中
的
函数
java
调用
so,
java
调用
dll也是同样的代码
C语言
调用
JAVA
的例子
C语言
调用
JAVA
的例子,一个用C语言如何
调用
JAVA
的例子,
调用
里面的方法 一个用C语言如何
调用
JAVA
的例子,
调用
里面的方法 一个用C语言如何
调用
JAVA
的例子,
调用
里面的方法 一个用C语言如何
调用
JAVA
的例子,
调用
里面的方法 ...
JNA-Linux下
java
程序
调用
so库接口
函数
在Linux系统下,
JAVA
程序通过JNA技术实现
调用
C语言编程输出的so库接口
函数
,从而实现
java
程序与c程序之间的交互。
Java SE
62,614
社区成员
307,326
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章