高分寻求 JNI 的用法? 看看thinking in java 2nd edition的appendix b 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 第一步是写出对固有方法及它的自变量进行声明的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会自动添加适当的文件扩展名。现在编译您的Java源文件,并对编译出来的.class文件运行javah。javah -jni ShowMsgBox 此时,我们要做的全部事情就是写一个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);}注意 : JNI统一了固有方法的命名规则;这一点是非常重要的,因为它属于虚拟机将Java调用与固有方法链接起来的机制的一部分。从根本上说,所有固有方法都要以一个“Java”起头,后面跟随Java方法的名字;下划线字符则作为分隔符使用。若Java固有方法“过载”(即命名重复),那么也把函数签名追加到名字后面。在原型前面的注释里,大家可看到固有的签名。 所说的java与c/c++的结合,实质是调用该语言编写的dll文件。主要的是 在java中声明native方法即:修饰符 native type method() 装载库 System.loadLibrary ("nameOfYourDll") 在c/c++中编写native方法的实现 先要在java中创建头文件 javah -jni yourFile 然后 #include <jni.h> #include "yourFile.h" #include ... JNIEXPORT void JNICALL Java_yourFile_method() java中protected使用问题 大哥这是怎么个情况 菜鸟问个奇怪的Double型问题。 ioexception SocketTimeoutException问题 求JFreeChart包 谁能帮忙解决下这个问题?关于文件读取和排序的问题 关于调用一个继承serializable接口的类遇到的奇怪问题,高分相赠!!! 怎么得到某个目录下所有文件的名字 javac 无法编译包含第三方jar包的项目 我要是问JAVA是做什么用的,那就太。。。。。那个什么了吧。 它和VC++的区别是什么呀? 100分求助!! 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");
}
}
javah -jni ShowMsgBox
#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);
}注意 : JNI统一了固有方法的命名规则;这一点是非常重要的,因为它属于虚拟机将Java调用与固有方法链接起来的机制的一部分。从根本上说,所有固有方法都要以一个“Java”起头,后面跟随Java方法的名字;下划线字符则作为分隔符使用。若Java固有方法“过载”(即命名重复),那么也把函数签名追加到名字后面。在原型前面的注释里,大家可看到固有的签名。
在java中声明native方法
即:
修饰符 native type method() 装载库
System.loadLibrary ("nameOfYourDll")
在c/c++中编写native方法的实现
先要在java中创建头文件 javah -jni yourFile
然后
#include <jni.h>
#include "yourFile.h"
#include ...
JNIEXPORT void JNICALL
Java_yourFile_method()