请教关于JNI的问题!

seasky_csdn 2004-08-24 10:23:39
我的java文件是TestToolsBootstrap.java,在里面声明:
public native void topsideTesttools();
另外在一个方法里面调用:
this.topsideTesttools();

我的c文件是topside.c,是这样写的:
#include <jni.h>
#include "TestToolsBootstrap.h"
#include <stdio.h>

JNIEXPORT void JNICALL
Java_TestToolsBootstrap_topsideTesttools(JNIEnv *env, jobject obj)
{
printf("Hello world!\n");
return;
}

首先得到TestToolsBootstrap.class,然后用javah -jni得到TestToolsBootstrap.h,然后用vc的编译器得到topside.dll,将其拷贝到winnt\system32下,然后执行java程序,却提示连接错误:
java.lang.UnsatisfiedLinkError: topsideTesttools

请问是怎么回事?
...全文
179 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
seasky_csdn 2004-08-24
  • 打赏
  • 举报
回复
加了static修饰符,还是一样的错误啊
seasky_csdn 2004-08-24
  • 打赏
  • 举报
回复
你是说调用topsideTesttools方法的方法应该是静态方法?
自然80 2004-08-24
  • 打赏
  • 举报
回复
你用的不是静态方法,看看你的java代码
seasky_csdn 2004-08-24
  • 打赏
  • 举报
回复
已经搞定了,native方法不需要是静态的,问题出在我的java程序是在包里的,在c程序中函数名里面没有包含包。
seasky_csdn 2004-08-24
  • 打赏
  • 举报
回复
我改为下面这样可还是一样的错误啊
public native static void topsideTesttools();
...
public static void callback() throws Exception{
System.loadLibrary("topside");
new TestToolsBootstrap().topsideTesttools();
...
}
seasky_csdn 2004-08-24
  • 打赏
  • 举报
回复
你的意思是native方法必须是静态的?但是java tutorial里面不是啊
另外,只能在main方法里调用吗?其它方法不行?
自然80 2004-08-24
  • 打赏
  • 举报
回复
//Jrunc.java
package jnijc;

public class Jrunc
{
public Jrunc()
{
}
public native static String helloWorld();
public native static int sum(int a,int b);

}
//Test.java
package jnijc;

public class Test
{
public Test()
{
}

public static void main(String[] args)
{
Test test1 = new Test();
try
{
System.loadLibrary("jnijc_Jrunc") ;
Jrunc jc=new Jrunc();
System.out .println(jc.helloWorld() ) ;
System.out .println(jc.sum(1,2) );
}
catch(Exception ex)
{
ex.printStackTrace() ;
}
}

}
//jnijc_Jrunc.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jnijc_Jrunc */

#ifndef _Included_jnijc_Jrunc
#define _Included_jnijc_Jrunc
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: jnijc_Jrunc
* Method: helloWorld
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_jnijc_Jrunc_helloWorld
(JNIEnv *, jclass);

/*
* Class: jnijc_Jrunc
* Method: sum
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_jnijc_Jrunc_sum
(JNIEnv *, jclass, jint, jint);

#ifdef __cplusplus
}
#endif
#endif
//jnijc_Jrunc.cpp
#include "jnijc_Jrunc.h"
/*
* Class: jnijc_Jrunc
* Method: helloWorld
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_jnijc_Jrunc_helloWorld
(JNIEnv *env, jclass jc)
{
char hello[]="hello world!";
jstring a=env->NewStringUTF(hello);
return a;
}

/*
* Class: jnijc_Jrunc
* Method: sum
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_jnijc_Jrunc_sum
(JNIEnv *env, jclass jc, jint jia, jint jib)
{
jint sum=jia+jib;
return sum;
}
int main()
{
return 0;
}

62,623

社区成员

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

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