当前位置: 技术问答>java相关
关于jni的一点困惑
来源: 互联网 发布时间:2015-05-03
本文导语: 我把jni打包成一个jar文件,package demo; 我用了两种方法来调用 1、带package package packageTest; import demo.*; public class A { public static void main(String[] args) { softCertProxy scp =new softCertProxy(); byte[] version =new byte[10]...
我把jni打包成一个jar文件,package demo;
我用了两种方法来调用
1、带package
package packageTest;
import demo.*;
public class A
{
public static void main(String[] args)
{
softCertProxy scp =new softCertProxy();
byte[] version =new byte[10];
String temp;
scp.Crypt_Get_Version_Java(version);
temp =new String(version);
System.out.println(temp);
}
}
dll放在packageTest的上层路径下或当前路径下
javac packageTest.A
出现java.lang.UnsatisfiedLinkError
2、不带package
import demo.*;
public class A
{
public static void main(String[] args)
{
softCertProxy scp =new softCertProxy();
byte[] version =new byte[10];
String temp;
scp.Crypt_Get_Version_Java(version);
temp =new String(version);
System.out.println(temp);
}
}
dll放在当前路径下
java A,调用成功
为什么加了package就不行了呢,该怎么改呢?
我用了两种方法来调用
1、带package
package packageTest;
import demo.*;
public class A
{
public static void main(String[] args)
{
softCertProxy scp =new softCertProxy();
byte[] version =new byte[10];
String temp;
scp.Crypt_Get_Version_Java(version);
temp =new String(version);
System.out.println(temp);
}
}
dll放在packageTest的上层路径下或当前路径下
javac packageTest.A
出现java.lang.UnsatisfiedLinkError
2、不带package
import demo.*;
public class A
{
public static void main(String[] args)
{
softCertProxy scp =new softCertProxy();
byte[] version =new byte[10];
String temp;
scp.Crypt_Get_Version_Java(version);
temp =new String(version);
System.out.println(temp);
}
}
dll放在当前路径下
java A,调用成功
为什么加了package就不行了呢,该怎么改呢?
|
dll应该放在系统的PATH路径之下,和包名没有关系的。安全起见可以直接放在system32目录
|
如果有PACKAGE的话DLL文件应该放在PACKAGE上一层目录,也就是和PACKAGE同一级目录下!
|
如果在本机调用,需要加环境变量LD_LIBRARY_PATH, 使它指向动态库的路径。
如果打包,需要改动本机的虚拟机存取权限。
如果打包,需要改动本机的虚拟机存取权限。
|
那我在jbuilder下调用本地方法错误也是这种,原来和package有关,我来试试看
|
那你看看这个有什么问题
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
#include
#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 failedn");
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写的函数什么地方有包的名字信息?
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
#include
#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 failedn");
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写的函数什么地方有包的名字信息?
|
Java_softCertProxy_Crypt_1Get_1Version_1Proxy函数为:
package : softCertProxy.Crypt.1Get
class : 1Version
Function : 1Proxy
注意:在JNI中不可以随便加下划线的。
现在的话函数名和class,package的命名也不对了。
(不可以用数字开头)。
package : softCertProxy.Crypt.1Get
class : 1Version
Function : 1Proxy
注意:在JNI中不可以随便加下划线的。
现在的话函数名和class,package的命名也不对了。
(不可以用数字开头)。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。