还是不要自己写.h和函数声明,用javah生成省时省力。
比如你的类是:pkg.ClassName,ClassName.class放在d:\work\pkg\下
那么你在d:\work\下执行javah pkg.ClassName
就成了
比如你的类是:pkg.ClassName,ClassName.class放在d:\work\pkg\下
那么你在d:\work\下执行javah pkg.ClassName
就成了
解决方案 »
- 问一个新手问题?
- 关于sql server指针回滚问题
- JAVA多线程中生产者与消费者问题中synchronized方法中为什么用while而不用if~~~
- 有关JAVA中使用SQL语句后返回记录集的问题!
- 有一个jar文件,我用rar解压后替换其中一个class,然后在生成jar.怎么就不能用了??
- 现在是学JAVA找工作容易还是C# .Net容易?
- 原创JAVA整站抓取工具原代码下载!
- 求助各路英雄豪杰!!!!!!
- 我下载了一个java写的application,是一个jar文件,然后
- Junit单元测试用例
- 请JAVA高手指点:JAVA初学者应该看什么书,和JAVA的学习路线?有高分
- 构造函数是否必须要和类名相同。
有使用jni的详细实例说明.
(JNIEnv *env, jobject,jobjectArray MediaStatus)
我现在想把形参中的array首地址给一个指针,然后我用一个方法
向这个地址里写进内容,最后把内容返回到java程序里。像jbytearray就用GetByteArrayElements 和ReleaseByteArrayElements
两个函数就可以实现了,而jobjectarray呢?怎么来做?多谢指教,工作上遇到这样问题,几天未有进展,忧心如焚,多谢多谢
public class HelloWorld {
public HelloWorld() {
}
public native void displayHelloWorld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
生成.class,然后用javah指令生成了HelloWorld.h文件,
#include <jni.h>#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);#ifdef __cplusplus
}
#endif
#endif实现了HelloWorldImp.c:
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!\n");
return;
}然后生成hello.dll:
cl -Ic:\java\include -Ic:\java\include\win32
-LD HelloWorldImp.c -Fehello.dll
.class,.h,.c,.dll在同目录下,
然后在环境变量中设置path为该目录,在classpath中设置该目录和.dll文件名,
运行.class, 总是抛出java.lang.UnsatisfiedLinkError, 好象System.loadLibrary("hello")找不到hello.dll,不知道错在什么地方?
这个例子是http://java.sun.com中的.
我用javah生成.h时在.class文件同目录下用javah HelloWorld和javah -jni HelloWorld总是提示Error:class HelloWorld could not be found.
要用javah -jni -classpath D;\...\jnitst\ HelloWorld,才能生成头文件.
这是为什么? 是不是生成头文件有问题才造成运行时抛出UnsatisfiedLinkError?
projectname\src\jnitst\HelloWrold.java
projectname\classes\jnitst\HelloWrold.class
projectname\classes\jnitst\HelloWrold.h
projectname\classes\jnitst\HelloWroldImp.c
projectname\classes\jnitst\HelloWrold.dll
那么应当
set CLASSPATH=%CLASSPATH%;projectname\classes\
即把projectname\classes\jnitst\HelloWrold.class
改成projectname\HelloWrold.class
可以把dll放到系统目录下。
这可能是jar的设计问题,因为dll被装载进来是以包的路径为参照的,所以如果你不放到第一级目录的话,它会找不到dll的内存地址。