翻开java里对object定义的文件,我看到很多nativ方法
如:public class Object { private static native void registerNatives();
static {
registerNatives();
}
public final native Class<?> getClass();
public native int hashCode();
protected native Object clone() throws CloneNotSupportedException;
public final native void notify(); public final native void notifyAll(); public final native void wait(long timeout) throws InterruptedException;}
但很多介绍jni的入门文章中都说,要用System.loadLibrary("动态连接") 来加载外部逻辑.但我都没找到这个加载呀.
能不能告诉java是怎么加载这些外部逻辑的呢.
谢谢先!!
如:public class Object { private static native void registerNatives();
static {
registerNatives();
}
public final native Class<?> getClass();
public native int hashCode();
protected native Object clone() throws CloneNotSupportedException;
public final native void notify(); public final native void notifyAll(); public final native void wait(long timeout) throws InterruptedException;}
但很多介绍jni的入门文章中都说,要用System.loadLibrary("动态连接") 来加载外部逻辑.但我都没找到这个加载呀.
能不能告诉java是怎么加载这些外部逻辑的呢.
谢谢先!!
LZ可以看一下!
System.loadLibrary("NativeCode"); 而我想问下,java在加载那写本地接口时,是怎么加载的?我都没看到 System.loadLibrary 这句啊```我只想问这一句写在了哪里?
public static void loadLibrary(String libname) {
Runtime.getRuntime().loadLibrary0(getCallerClass(), libname);
}
一般情况下,JAVA是不能调用标准动态库的,你需要用jni技术写一个自己的动态库,比如我项目调用硬件的一个例子:public class DouDeLi { private static DouDeLi doudeli = null;
public static DouDeLi getInstance(){
if(doudeli == null)
doudeli = new DouDeLi();
return doudeli;
} //这里调用JQCardA.dll动态库
static{
System.loadLibrary("JQCardA");
}
/**
* 功能: 用来打开一个串行端口, 在做所有的操作之前, 请调用此函数来设置并打开一个有效的串行端口,
* 否则调用其他函数将无法返回正确结果。
参数说明:
PortNum 是一个正整数, 表示用户想打开的串行端口号, 一般为1 或2, 如果用户扩展了PC 机的串
行端口,也可以使用其它, 但是一般小于10。
Note: 在调用此函数时,请选择一个有效的端口号, ( 没被其它设备占用且存在的端口), 如果端
口无效,则返回false。 打开端口成功, 则返回true,
*/
native public boolean openCommPort(int port);
/**
* 功能: 用来关闭用OpenCommPort函数打开的端口。
* 如果关闭端口成功, 将返回TRUE, 否则返回FALSE。
*/
native public boolean closeCommPort();
/**
* NOTE:在返回的16位数据串中:1-2位是用十六进制表示的考勤机地址,它转换后应该等于ADDR(可以
* 参考GatherData函数中的举例),3-4位是“07”,5-6位是“04”或“09”(它代表清除读卡标志位,
* “04”表示正常的卡号的标志,“09”表示已被清除的标志。使用者可以根据它来处理该数据串)7-16
* 位是读到的卡号。
*/
native public String readCardNo(int addr);.....这里其它方法省略这样子写好后就用jni生成一个.h文件,你用C或C++就可以写自己的动态库调用标准动态库了.
public static void loadLibrary(String libname) {
Runtime.getRuntime().loadLibrary0(getCallerClass(), libname);
}
一般情况下,JAVA是不能调用标准动态库的,你需要用jni技术写一个自己的动态库,比如我项目调用硬件的一个例子:public class DouDeLi { private static DouDeLi doudeli = null;
public static DouDeLi getInstance(){
if(doudeli == null)
doudeli = new DouDeLi();
return doudeli;
} //这里调用JQCardA.dll动态库
static{
System.loadLibrary("JQCardA");
}
/**
* 功能: 用来打开一个串行端口, 在做所有的操作之前, 请调用此函数来设置并打开一个有效的串行端口,
* 否则调用其他函数将无法返回正确结果。
参数说明:
PortNum 是一个正整数, 表示用户想打开的串行端口号, 一般为1 或2, 如果用户扩展了PC 机的串
行端口,也可以使用其它, 但是一般小于10。
Note: 在调用此函数时,请选择一个有效的端口号, ( 没被其它设备占用且存在的端口), 如果端
口无效,则返回false。 打开端口成功, 则返回true,
*/
native public boolean openCommPort(int port);
/**
* 功能: 用来关闭用OpenCommPort函数打开的端口。
* 如果关闭端口成功, 将返回TRUE, 否则返回FALSE。
*/
native public boolean closeCommPort();
/**
* NOTE:在返回的16位数据串中:1-2位是用十六进制表示的考勤机地址,它转换后应该等于ADDR(可以
* 参考GatherData函数中的举例),3-4位是“07”,5-6位是“04”或“09”(它代表清除读卡标志位,
* “04”表示正常的卡号的标志,“09”表示已被清除的标志。使用者可以根据它来处理该数据串)7-16
* 位是读到的卡号。
*/
native public String readCardNo(int addr);.....这里其它方法省略这样子写好后就用jni生成一个.h文件,你用C或C++就可以写自己的动态库调用标准动态库了.
当我调用object.hashCode()的时候,很明显方法返回了结果,但在原码里我都没看到哪里加载了动态连接.即外部逻辑.我只想知道,java在什么时候加载的动态连接,加载的代码(System.loadLibrary)在哪儿写着呢.大家别想错了呀`
System.loadLibrary("NativeCode");
===在这里看到 System.loadLibrary("NativeCode"); ===我都没看到 System.loadLibrary 这句啊``` 这里又说没看到! 在那篇文章里写的很清楚了哦 你可以自己在本机上写一段代码运行的嘛!
System.loadLibrary("NativeCode"); //这里的"NativeCode" 就是在那篇文章中的{4、将C/C++源文件编译成动态连接库(DLL)
操作:
-->右击IDE左上角NativeCode工程选择生成(在NativeCode项目的子文件夹Debug下的NativeCode.dll文件)} 生成的文件啊.呵 还是建议LZ现在自己的机器上搭建一个C++的环境 然后做一个简单的例子 估计按照步骤做下来大概的东西你就清楚了.
哦? JAVA本身的代码有用到JNI吗? JAVA只是提供了System.loadLibrary();方法让程序员去调用本地接口而已. 如果JAVA本身使用到了JNI估计就不会"一次编译,到处运行了"
建议LZ看一下http://www.itisedu.com/phrase/200604261218435.html 或在网上搜一下JNI相关资料看一下。
你可以看下 java的原代码哦``OBJECT.JAVA里都定义了很多native方法呢`