这是在网上下的代码,简单的用jni去调dll,可是很多地方有疑问,请大侠们帮我看看
编写 Java 代码:
public class TestJNI {
public native void greetings(); static {
System.loadLibrary("greet");
} public static void main(String args[]) {
new TestJNI().greetings();
}
}
编译 Java 文件:
jvc TestJNI.java
生成类文件上运行 JavaH:
javah -jni TestJNI
编写 C/C++ 代码根据生成的头文件:
#include "TestJNI.h"
#include <stdio.h> JNIEXPORT void JNICALL Java_TestJNI_greetings(JNIEnv *env,jobject jobj) {
printf("Hello from Visual C++!"); //每次都要用c++来重新实现一次dll里的函数么
}
编译 C/C++ 代码:
cl greet.cpp -Ic:\sdk-java.31\include -Fegreet.dll -MD -LD //编译出来的是个什么东西,是dll么,是的话为什么又写了一个dll?
测试应用程序:
jview TestJNI //jview是什么命令? 以后怎么用TestJNI这个类啊
怎么看起来是先有的java后写的dll啊,太晕了
编写 Java 代码:
public class TestJNI {
public native void greetings(); static {
System.loadLibrary("greet");
} public static void main(String args[]) {
new TestJNI().greetings();
}
}
编译 Java 文件:
jvc TestJNI.java
生成类文件上运行 JavaH:
javah -jni TestJNI
编写 C/C++ 代码根据生成的头文件:
#include "TestJNI.h"
#include <stdio.h> JNIEXPORT void JNICALL Java_TestJNI_greetings(JNIEnv *env,jobject jobj) {
printf("Hello from Visual C++!"); //每次都要用c++来重新实现一次dll里的函数么
}
编译 C/C++ 代码:
cl greet.cpp -Ic:\sdk-java.31\include -Fegreet.dll -MD -LD //编译出来的是个什么东西,是dll么,是的话为什么又写了一个dll?
测试应用程序:
jview TestJNI //jview是什么命令? 以后怎么用TestJNI这个类啊
怎么看起来是先有的java后写的dll啊,太晕了
java虚拟机实例只会加载一次dll文件,loadlibery方法在static块中就是如此表示的,而且大部分jdk api都是本地方法,你查看了jdk源码应该会清楚。
对于你第二个问题,我感到很无语。
一般来说都是先写java再写dll的,这本书没什么特别的。
提供资源:
1、 常用源代码样例库。
2、 三星用户达八千九百万,市场份额占据第二位,存在巨大的商机。
3、 三星专用SDK、API、新功能指导建议,集中的机型适配所需资源。
4、 工程师答疑,帮助解决开发中的疑难杂症。
5、 免费远程真机测试—远程互联网预约挂在网上的真机,上传软件测试,机型丰富。
6、 三星在线商店,机器预装,帮你推销软件。让你轻松赢得第一桶金。
你要调用的其他dll可以通过在这个dll去调用
一般来说应该是先有dll而后调用的,
但其他程序编写的dll和java能直接调用的接口和参数类型不一定匹配
所以就在java里重新写一个dll去调用其他的dll
当然,如果你的dll的接口本身就符合jni规范,那你直接就可以调用了,不需要生成这个dll
#include "TestJNI.h"
#include <stdio.h> JNIEXPORT void JNICALL Java_TestJNI_greetings(JNIEnv *env,jobject jobj) {
printf("Hello from Visual C++!"); //每次都要用c++来重新实现一次dll里的函数么
}
//每次都要实现编译 C/C++ 代码:
cl greet.cpp -Ic:\sdk-java.31\include -Fegreet.dll -MD -LD //编译出来的是个什么东西,是dll么,是的话为什么又写了一个dll?
//编译出来的dll就是给java用的那个测试应用程序:
jview TestJNI //jview是什么命令? 以后怎么用TestJNI这个类啊
怎么看起来是先有的java后写的dll啊,太晕了//jview?应该是java TestJNI命令吧
//TestJNI的用法就是忽略native关键字,跟正常java类一样
//先有java,再写dll,就像先有接口再有实现是一个道理,而且C的实现方法名字需要遵循JNI规范,先写java在javah比较方便