获得;Java结果:-1073741571“;关于加载库Cryptopp

获得;Java结果:-1073741571“;关于加载库Cryptopp,java,java-native-interface,native-code,crypto++,Java,Java Native Interface,Native Code,Crypto++,我尝试将自定义的C++ DLL(使用JNI)加载到java,但是我有一个问题:IdLLL使用Cuthopp库,当java尝试加载依赖(包括CytoTopp)时,应用程序退出消息: Java结果:-1073741571 这是什么,我可以在不删除cryptopp的情况下修复此问题吗 更新: 如果我对文件zCypto.h和zCypro.cpp进行了注释,并删除了cryptopp库的所有用法,则该库不会出现任何错误,如果我加载cryptopp,则会引发错误。 Java代码: public static

我尝试将自定义的C++ DLL(使用JNI)加载到java,但是我有一个<强>问题:IdLLL使用Cuthopp库,当java尝试加载依赖(包括CytoTopp)时,应用程序退出消息:

Java结果:-1073741571

这是什么,我可以在不删除cryptopp的情况下修复此问题吗


更新:

如果我对文件zCypto.h和zCypro.cpp进行了注释,并删除了cryptopp库的所有用法,则该库不会出现任何错误,如果我加载cryptopp,则会引发错误。 Java代码:

public static void main(String[] args){
    System.loadLibrary("cryptopp");
    System.loadLibrary("ZCPP_Code64");
}
CPP源代码(我在Visual Studio 2012中创建dll):

标题:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class ru_zontwelg_Loader */

#ifndef _Included_ru_zontwelg_Loader
#define _Included_ru_zontwelg_Loader

extern "C" {

    /*
     * Class:     ru_zontwelg_Loader
     * Method:    loadCache
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_ru_zontwelg_Loader_loadCache
        (JNIEnv *, jobject);

}

#endif
/*不要编辑此文件-它是机器生成的*/
#包括
/*ru_zontwelg_类装载机的标头*/
#如果NDEF包括区域装载机
#定义包含的分区加载程序
外部“C”{
/*
*类别:ru_zontwelg_装载机
*方法:loadCache
*签字:()五
*/
JNIEXPORT void JNICALL Java\u ru\u zontwelg\u Loader\u loadCache
(JNIEnv*,jobject);
}
#恩迪夫
zCrypto.h:

#ifndef ZontWelg_zCrypto
#define ZontWelg_zCrypto

#include <dll.h>

#include <cstdio>
#include <Windows.h>
#include <iostream>

#include "cryptlib.h"
using CryptoPP::Exception;

#include "hex.h"
using CryptoPP::HexEncoder;
using CryptoPP::HexDecoder;

#include "base64.h"
using CryptoPP::Base64Encoder;
using CryptoPP::Base64Decoder;

#include "filters.h"
using CryptoPP::StringSink;
using CryptoPP::StringSource;
using CryptoPP::StreamTransformationFilter;

#include "sha.h"
#include "rsa.h"
#include "hex.h"
#include "osrng.h"
#include "secblock.h"
#include "modes.h"
#include "aes.h"
using CryptoPP::AES;

//#include "ccm.h"
using CryptoPP::CBC_Mode;

#pragma comment(lib, "cryptlib.lib")
//#pragma comment(lib, "crypt32.lib")
#pragma comment(lib, "cryptopp.lib")

using namespace std;

class zCrypto {
public:
    static string base64(string in);
    static string from_base64(string in);

    static string decrypt(const std::string& str_in);
};

#endif
\ifndef ZontWelg\u zCrypto
#定义Zontwelgzcrypto
#包括
#包括
#包括
#包括
#包括“cryptlib.h”
使用CryptoPP::Exception;
#包括“十六进制h”
使用CryptoPP::HexEncoder;
使用CryptoPP::HexDecoder;
#包括“base64.h”
使用CryptoPP::Base64编码器;
使用CryptoPP::Base64解码器;
#包括“filters.h”
使用CryptoPP::StringSink;
使用CryptoPP::StringSource;
使用CryptoPP::StreamTransformationFilter;
#包括“sha.h”
#包括“rsa.h”
#包括“十六进制h”
#包括“osrng.h”
#包括“secblock.h”
#包括“modes.h”
#包括“aes.h”
使用CryptoPP::AES;
//#包括“ccm.h”
使用CryptoPP::CBC_模式;
#pragma注释(lib,“cryptlib.lib”)
//#pragma注释(lib,“crypt32.lib”)
#pragma注释(lib,“cryptopp.lib”)
使用名称空间std;
zCrypto类{
公众:
静态字符串base64(字符串输入);
来自_base64的静态字符串(字符串输入);
静态字符串解密(const std::string&stru-in);
};
#恩迪夫

这对我来说很奇怪,但无论如何我都不是JNI专家:

publicstaticvoidmain(字符串[]args){
系统加载库(“cryptopp”);
系统加载库(“ZCPP_代码64”);
}
我希望看到类似的东西(来自我的一个Crypto++/Android/JNI项目):

公共类PRNG{
静止的{
系统加载库(“stlport_共享”);
系统加载库(“cryptopp”);
系统加载库(“prng”);
}
专用静态本机int-CryptoPP_-Reseed(字节[]字节);
私有静态本机int CryptoPP_GetBytes(字节[]字节);
私有静态对象锁=新对象();
//返回消耗的字节数。
公共静态整型种子(字节[]种子){
已同步(锁定){
返回加密种子(种子);
}
}
//返回生成的字节数。
公共静态整型GetBytes(字节[]字节){
已同步(锁定){
返回CryptoPP_GetBytes(字节);
}
}
}
不要担心stlport_共享的
stlport_
,因为它是安卓的东西


这看起来也很奇怪:

#pragma注释(lib,“cryptlib.lib”)
//#pragma注释(lib,“crypt32.lib”)
#pragma注释(lib,“cryptopp.lib”)
因为您正在调用
System.loadLibrary(“cryptopp”)
,这意味着您正在使用Crypto++DLL。这也意味着这是不需要的:
#pragma注释(lib,“cryptlib.lib”)
。选择静态链接或动态链接,但不能同时选择两者

如果您(1)构建
ZCPP_Code64
DLL,并且(2)静态链接到Crypto++,那么这可能是最简单的。然后,您的静态加载程序将如下所示:

静态{
系统加载库(“ZCPP_代码64”);
}

如果选择针对Crypto++的静态链接,则可能需要重建静态库。这是因为您最终将处于以下配置:

DLL->针对C运行时的动态链接
Crypto++LIB->针对C运行时的静态链接
这将导致大量重复符号(C运行时符号)。你想要的是:

DLL->针对C运行时的动态链接
Crypto++LIB->针对C运行时的动态链接
要修复此问题,请打开Cryptlib项目,并将运行时链接对象从静态更改为动态。请参阅第页的“静态链接与动态链接”


在我看来这没问题:

JNIEXPORT void JNICALL Java\u ru\u zontwelg\u loadCache
(JNIEnv*env,jobject-jobj)
{
...
}
我不确定的是。。。需要在Windows上定位本机库的位置。为此,请看一看


如果多个线程访问同一个底层Crypto++对象,您还必须执行锁定。在我的例子中,底层对象是一个
autoseedrandompool

公共类PRNG{
...
//返回消耗的字节数。
公共静态整型种子(字节[]种子){
已同步(锁定){
返回加密种子(种子);
}
}
//返回生成的字节数。
公共静态整型GetBytes(字节[]字节){
已同步(锁定){
返回CryptoPP_GetBytes(字节);
}
}
}
在您的情况下,它可能是
base64编码器
base64解码器

记住,所有Crypto++类对象都是线程安全的,这意味着它们不会访问全局或共享数据。但当多个线程(mis)使用同一对象时,它们是不安全的


我为JNI问题咨询的书是



最后,对“答案”表示抱歉。这不是一个真正的答案。相反,它是一个不适合注释块的大注释。

如果不查看代码,很难判断您做错了什么。你能试着制作一个显示这个问题的尽可能小的程序,并把它粘贴到这里吗。搜索becau可能很棘手
#ifndef ZontWelg_zCrypto
#define ZontWelg_zCrypto

#include <dll.h>

#include <cstdio>
#include <Windows.h>
#include <iostream>

#include "cryptlib.h"
using CryptoPP::Exception;

#include "hex.h"
using CryptoPP::HexEncoder;
using CryptoPP::HexDecoder;

#include "base64.h"
using CryptoPP::Base64Encoder;
using CryptoPP::Base64Decoder;

#include "filters.h"
using CryptoPP::StringSink;
using CryptoPP::StringSource;
using CryptoPP::StreamTransformationFilter;

#include "sha.h"
#include "rsa.h"
#include "hex.h"
#include "osrng.h"
#include "secblock.h"
#include "modes.h"
#include "aes.h"
using CryptoPP::AES;

//#include "ccm.h"
using CryptoPP::CBC_Mode;

#pragma comment(lib, "cryptlib.lib")
//#pragma comment(lib, "crypt32.lib")
#pragma comment(lib, "cryptopp.lib")

using namespace std;

class zCrypto {
public:
    static string base64(string in);
    static string from_base64(string in);

    static string decrypt(const std::string& str_in);
};

#endif