1. 分清楚 System.load 与 System.loadLibrary
<pre>
System.load
// System.load 参数必须为库文件的绝对路径,可以是任意路径,例如:
System.load("C:\Documents and Settings\TestJNI.dll"); //Windows
System.load("/usr/lib/TestJNI.so"); //Linux
System.loadLibrary
//System.loadLibrary 参数为库文件名,不包含库文件的扩展名。
System.loadLibrary ("TestJNI"); // 加载 Windows 下的 TestJNI.dll 本地库
System.loadLibrary ("TestJNI"); // 加载 Linux 下的 libTestJNI.so 本地库
// 注意:TestJNI.dll 或 libTestJNI.so 必须是在 JVM 属性 java.library.path 所指向的路径中。
</pre>
2. 以上为原理(都不好使!!!)
<pre>
GlobalFunction.getSingleton().loadJNILibrary("zlprint");
loadJNILibrary
这个炸天方法是自动从 classpath 或者 jar 包中寻找 zlprint.dll 或者 zlprint.so(具体根据 OS 系统平台决定)
重复加载相同的 dll 会报错哦!
loadJNILibrary 要区分 x86 和 x64,假设你有相同的两个 zlprint.dll,请在前面加上目录限定名称,比如:windows-x86_64/zlprint
</pre>
3.JavaCPP 的坑
执行这些命令行的时候需要在 Visual Studio 20XX 的命令提示符下运行
$ javac -cp javacpp.jar NativeLibrary.java
$ java -jar javacpp.jar NativeLibrary
$ java -cp javacpp.jar NativeLibrary
因为最后一行命令会调用 VS 的运行环境编译器 cl.exe,不是在 Visual Studio x64 Win64 Command Prompt (2010)命令中执行就找不到这玩意儿!
如果你写的 xxx.java 文件中包含了 package 信息,编译的时候应该把 xxx.class 文件放在 package 目录下才能够编译 (这是 java 常识)
JavaCPP 中的注解 annotation 都是针对 c ++ 文件生成而言,跟 java 文件本身没有任何毛关系!
作用是为了配置生成的 cpp 代码而存在
@Platform(include=”PrintLib.h”,link =”D:/javacpp-bin/zlprint”)
头文件包含可以这样:include={“PrintLib.h”,”string.h”}
更多控制系统学习资料