如何在 java中调用 c函数~!

arlalei 2005-07-14 06:31:05
如何在 java中调用 c函数~!
操作系统是 solaries~
...全文
255 12 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
自己先顶~!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧