当前位置: 技术问答>linux和unix
unix 下 java 调用c 然后c再调用c 怎么实现,请给点意见
来源: 互联网 发布时间:2016-05-27
本文导语: 清单 1. HelloWorld.java class HelloWorld { public native void displayHelloWorld(); static { System.loadLibrary("hello"); } public static void main(String[] args) { new HelloWorld().displayHe...
清单 1. HelloWorld.java
class HelloWorld {
public native void displayHelloWorld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
清单 2. HelloWorld.c
#include
#include "HelloWorld.h"
#include
JNIEXPORT void JNICALL
/*另一个c文件中的方法*/
extern void helloTest();
static void *gmod;
static void (*gfunc)();
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
gmod = dlopen("helloworld.so", "RTLD_LAZY");
gfunc = (void(*)())dlsym(gmod, "helloTest");
return;
}
清单 3. Hello.c
void helloTest() {
printf("Hello world!n");
return;
}
注:以上三个文件放到同一个目录.
(1):编译java文件,生成class文件:运行javac HelloWorld.java
(2):根据class文件生成C语言的头文件:javah HelloWorld,生成HelloWorld.h
(3):根据hello.c生成helloworld.so文件:gcc hello.c –shared –o helloworld.so
(4):根据hello.c生成helloworld.so文件:gcc HelloWorld.c –shared –o hello.so
(5):运行java文件:java –Djava.library.path=. HelloWorld
以上是我的执行步骤,但是不成功,不知道什么原因。请各位给点意见,不胜感激。
当java单纯调用c时候是可以成功的。以下代码是java单纯调用c时候可以调用成功:
清单 1. HelloWorld.java
class HelloWorld {
/* Native method declaration */
public native void displayHelloWorld();
/* Use static intializer */
static {
System.loadLibrary("hello");
}
/* Main function calls native method*/
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
清单 2. HelloWorld.c
#include
#include "HelloWorld.h"
#include
JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!n");
return;
}
class HelloWorld {
public native void displayHelloWorld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
清单 2. HelloWorld.c
#include
#include "HelloWorld.h"
#include
JNIEXPORT void JNICALL
/*另一个c文件中的方法*/
extern void helloTest();
static void *gmod;
static void (*gfunc)();
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
gmod = dlopen("helloworld.so", "RTLD_LAZY");
gfunc = (void(*)())dlsym(gmod, "helloTest");
return;
}
清单 3. Hello.c
void helloTest() {
printf("Hello world!n");
return;
}
注:以上三个文件放到同一个目录.
(1):编译java文件,生成class文件:运行javac HelloWorld.java
(2):根据class文件生成C语言的头文件:javah HelloWorld,生成HelloWorld.h
(3):根据hello.c生成helloworld.so文件:gcc hello.c –shared –o helloworld.so
(4):根据hello.c生成helloworld.so文件:gcc HelloWorld.c –shared –o hello.so
(5):运行java文件:java –Djava.library.path=. HelloWorld
以上是我的执行步骤,但是不成功,不知道什么原因。请各位给点意见,不胜感激。
当java单纯调用c时候是可以成功的。以下代码是java单纯调用c时候可以调用成功:
清单 1. HelloWorld.java
class HelloWorld {
/* Native method declaration */
public native void displayHelloWorld();
/* Use static intializer */
static {
System.loadLibrary("hello");
}
/* Main function calls native method*/
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
清单 2. HelloWorld.c
#include
#include "HelloWorld.h"
#include
JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!n");
return;
}
|
HelloWorld.c文件代码修改如下
(1): 编译java文件,生成class文件:运行javac HelloWorld.java [对的]
(2): 根据class文件生成C语言的头文件:javah HelloWorld,生成HelloWorld.h [对的]
(3): 根据HelloWorld.c生成libhello.so文件: gcc –shared -I. –o libhello.so HelloWorld.c [我修改过的,自己对比下吧,这里的命名很重要]
(4): 根据hello.c生成libhelloworld.so文件: gcc –shared –o libhelloworld.so hello.c [我修改过的]
(5):运行java文件:java –Djava.library.path=. HelloWorld [对的]
说明:
在Linux下的库文件命名,有自己的规则,不是随便起名的。例如,如果你想生成一个名为hello的动态库,那么你需要把它命名为libhello.so,这样以后你就可以在编译程序的时候 -lhello 这样使用它了。这也正是System.loadLibrary("hello"); 为什么能正确加载libhello.so的原因。
#include "HelloWorld.h"
#include
static void *gmod;
static void (*gfunc)();
JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
gmod = dlopen("./libhelloworld.so", RTLD_LAZY); /* 这里的参数需要改动 */
gfunc = (void(*)())dlsym(gmod, "helloTest");
gfunc(); /* 总要调用下吧 */
return;
}
(1): 编译java文件,生成class文件:运行javac HelloWorld.java [对的]
(2): 根据class文件生成C语言的头文件:javah HelloWorld,生成HelloWorld.h [对的]
(3): 根据HelloWorld.c生成libhello.so文件: gcc –shared -I. –o libhello.so HelloWorld.c [我修改过的,自己对比下吧,这里的命名很重要]
(4): 根据hello.c生成libhelloworld.so文件: gcc –shared –o libhelloworld.so hello.c [我修改过的]
(5):运行java文件:java –Djava.library.path=. HelloWorld [对的]
说明:
在Linux下的库文件命名,有自己的规则,不是随便起名的。例如,如果你想生成一个名为hello的动态库,那么你需要把它命名为libhello.so,这样以后你就可以在编译程序的时候 -lhello 这样使用它了。这也正是System.loadLibrary("hello"); 为什么能正确加载libhello.so的原因。