当前位置:  技术问答>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就不行了呢,该怎么改呢?

|
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写的函数什么地方有包的名字信息?

|
Java_softCertProxy_Crypt_1Get_1Version_1Proxy函数为:

package : softCertProxy.Crypt.1Get
class : 1Version
Function : 1Proxy

注意:在JNI中不可以随便加下划线的。
       现在的话函数名和class,package的命名也不对了。
       (不可以用数字开头)。

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 编译JNI.h报大量错
  • JNI的问题
  • JNI++
  • 关于JNI的中文问题(急急急急急)
  • jni 问题 急急急 分数不够可以再加
  • jni的方法,用java调用c的代码,遇到的问题!
  • HTML标签参考手册 iis7站长之家
  • 请问如何用jni类来调用一个非java写的外部exe?谢谢!
  • 难道没有人可以告我如何在applet中使用jni方法吗?
  • 听同事说JNI很烂! 很容易出错! 是真的吗? 来着有分!
  • jni的一个小问题--路径问题?
  • 请问JNI是个什么东西?
  • jni难吗?谁有这方面的资料?
  • 哪儿有JNI的资料?
  • 100分求java +VC6.0使用JNI的最简单例子
  • solaris 上编译JNI库的问题
  • JNI 助手类 NativeCall
  • JNI代码生成器 JNIGen
  • JNI编程工具 Janet
  • LevelDB JNI


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3