如果有PACKAGE的话DLL文件应该放在PACKAGE上一层目录,也就是和PACKAGE同一级目录下!
解决方案 »
- OutputStreamWriter的charsetName参数是什么?
- 有空的来看下~ 谢谢,呵呵~
- 我写了一个wf聊天,可是不知道哪里错了,请高手指点。。。
- java中如何加上标签(初学者的问题)
- 高分请教java实现一个元搜索引擎问题
- 如何用程序列出一个包下的所有子包?
- 关于Image和ImageIcon的问题,请大侠指教!
- 请问如何转化字符串"\\FWV\Epson LQ-1600KII"成"\\\\FWV\\Epson LQ-1600KII"?
- 关于jbuilder6的使用问题(UI设计),欢迎讨论!
- Servelt怎么向ajax传集合?
- 我欲做一论坛,但不知论坛文章是存放在数据库里好还是直接放在硬盘里好。
- 访问数据库出现堆栈溢出,是何原因?
我试过了,可以找到soft_cert_proxy.dll,但是不能调用里面的本地方法Crypt_Get_Version_Proxy(byte[])。
放在package下时:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no soft_cert_proxy in java.library.path放在package上一层目录时:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Crypt_Get_Version_Proxychdw(米) 放在system32下也没用
Exception in thread "main" java.lang.UnsatisfiedLinkError: Crypt_Get_Version_Proxy
是不能调用这个本地方法
如果打包,需要改动本机的虚拟机存取权限。
LD_LIBRARY_PATH = $jni
export LD_LIBRARY_PATH
$/userhome/sh .profile
win系,添加同样的环境变量。
你打包的jar文件只要包含你的java class就可以了,而dll需要单独的拷贝。关于jvm的存取权限我把你的需求理解错了。
如果包名为a.b
类名 CC
方法为 Meth
Java_a_b_CC_Meth才是需要的名字,否则JVM根本无法区分在不同的类的同一个函数名称所对应的C入口
Exception in thread "main" java.lang.UnsatisfiedLinkError: Crypt_Get_Version_Proxy
at demo.softCertProxy.Crypt_Get_Version_Proxy(Native Method)
at demo.softCertProxy.Crypt_Get_Version_Java(softCertProxy.java:105)
at packageTest.A.main(A.java:11)
很清楚已经指向了 demo.softCertProxy.Crypt_Get_Version_Proxy
有可能是你没有写对,因为你改变了包名,这个C写的函数名称必须跟随改变
package demo;
public class softCertProxy
{
private native int Crypt_Get_Version_Proxy(byte[] version); static
{
try
{
System.loadLibrary("soft_cert_proxy");
}
catch(SecurityException e)
{
System.err.println("security failed "+e);
}
} public int Crypt_Get_Version_Java(byte[] version)
{
if (Crypt_Get_Version_Proxy(version) ==0)
{
System.out.println("The currently version is "+new String(version)); return 0;
}
else
System.out.println("Get version failed"); return 1;
}
}#include <stdio.h>
#include <windows.h>
#include "softCertProxy.h"
//#include "CaCrypt.h"typedef UINT (CALLBACK* CRYPT_GET_VERSION_DLL)(char *);JNIEXPORT jint JNICALL Java_softCertProxy_Crypt_1Get_1Version_1Proxy
(JNIEnv * jEnv, jobject this, jbyteArray version)
{
HINSTANCE hDLL;
CRYPT_GET_VERSION_DLL Crypt_Get_Version_Dll;
int flag =1;
hDLL =LoadLibrary("soft_cert");
Crypt_Get_Version_Dll =(CRYPT_GET_VERSION_DLL)GetProcAddress(hDLL,"Crypt_Get_Version");
if (!Crypt_Get_Version_Dll)
{
// handle the error
FreeLibrary(hDLL);
printf("dll link failed\n");
return flag;
}
else
{
jboolean* Version; Version =(*jEnv)->GetByteArrayElements(jEnv,version,0);
// call the function
if(Crypt_Get_Version_Dll(Version) ==0)
{
flag =0;
(*jEnv)->ReleaseByteArrayElements(jEnv,version,Version,0);
} return flag;
}
}C写的函数什么地方有包的名字信息?
class : 1Version
Function : 1Proxy注意:在JNI中不可以随便加下划线的。
现在的话函数名和class,package的命名也不对了。
(不可以用数字开头)。
* Class: softCertProxy
* Method: Crypt_Get_Version_Proxy
* Signature: ([B)I
*/
JNIEXPORT jint JNICALL Java_softCertProxy_Crypt_1Get_1Version_1Proxy
(JNIEnv *, jobject, jbyteArray);
这是javah后自动生成的.h文件,数字是他自己加上的
应该是
JNIEXPORT jint JNICALL Java_demo_softCertProxy_Crypt_1Get_1Version_1Proxy
(JNIEnv *, jobject, jbyteArray);
才是正确的函数入口
如果用javah除了-jni还有什么参数需要用的?
我自己加上demo后可以了,谢谢你,结帖时给分你^_^
我现在就想知道如何让java自己来加上package