UnsatisfiedLinkError после перемещения кода в пакет - PullRequest
0 голосов
/ 15 июня 2019

Я работаю над проектом, который должен использовать библиотеку .so (Ubuntu 18.04), все работает хорошо, когда я помещаю свой код Java в папку / src (я использую IntelliJ Idea), но после того, как я перееду мой код в именованный пакет (smutil), он вызывает некоторые ошибки, такие как «Исключение в потоке» main «java.lang.UnsatisfiedLinkError: smutil.GmSSL.digest (Ljava / lang / String; [B) [B»

Вот мой код

package smutil;
public class GmSSL {

public native String[] getVersions();
public native String[] getCiphers();
public native String[] getDigests();
public native String[] getMacs();
public native String[] getSignAlgorithms();
public native String[] getPublicKeyEncryptions();
public native String[] getDeriveKeyAlgorithms();
public native byte[] generateRandom(int length);
public native int getCipherIVLength(String cipher);
public native int getCipherKeyLength(String cipher);
public native int getCipherBlockSize(String cipher);
public native byte[] symmetricEncrypt(String cipher, byte[] in, byte[] key, byte[] iv);
public native byte[] symmetricDecrypt(String cipher, byte[] in, byte[] key, byte[] iv);
public native int getDigestLength(String digest);
public native int getDigestBlockSize(String digest);
public native byte[] digest(String algor, byte[] data);
public native String[] getMacLength(String algor);
public native byte[] mac(String algor, byte[] data, byte[] key);
public native byte[] sign(String algor, byte[] data, byte[] privateKey);
public native int verify(String algor, byte[] digest, byte[] signature, byte[] publicKey);
public native byte[] publicKeyEncrypt(String algor, byte[] in, byte[] publicKey);
public native byte[] publicKeyDecrypt(String algor, byte[] in, byte[] privateKey);
public native byte[] deriveKey(String algor, int keyLength, byte[] peerPublicKey, byte[] privateKey);
public native String[] getErrorStrings();

static {
    System.loadLibrary("gmssljni");
}
}

1 Ответ

0 голосов
/ 15 июня 2019

Вы, вероятно, упаковываете файл .so в JAR Обратите внимание, что когда у вас есть .so, загрузить библиотеку не так просто.

Чтобы загрузить разделяемую библиотеку, вы должны убедиться, что она находится в файловой системе. Вы можете преодолеть эту проблему, распаковав ее во временное местоположение.

Посмотрите здесь полный образец, иллюстрирующий эту тему:

https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo031

По сути, вам нужно сделать следующее:

  • найдите свой ресурс внутри JAR
  • извлечь его во временное местоположение
  • пользователь System.load(fullPathToFile)

Вот и все:)

Веселитесь вместе с JNI!

...