【问题标题】:UnsatisfiedLinkError thrown while initializing class初始化类时抛出 UnsatisfiedLinkError
【发布时间】:2014-05-23 09:42:28
【问题描述】:

我正在尝试使用 .so 库加密来自 android 应用程序的文本文件。 我为它创建了一个 c 程序 (encprog.c) 并使用 gcc 命令将其转换为 (.so) 文件即库。

加密文本文件的C程序如下:

encprog.c

        #include<stdio.h>
        #include<jni.h>

        void encrypt(char *name)
        {
        FILE *fp,*fp1;
        int choi;
        char temp[20]={"Temp.txt"},c;

        fp=fopen(name,"r+");
        if(fp==NULL)
          {
             printf("The file %s can't be open",name);
          }
        fp1=fopen(temp,"w+");
        if(fp1==NULL)
         {
           printf("The file Temp can't be open");
         }
         c=fgetc(fp);
        while(c!=EOF)
         {
         fputc((c+name[0]),fp1);
         c=fgetc(fp);
         }
         fclose(fp);
         fclose(fp1);
        remove(name);
        rename(temp,name);

        }

        void main()
        {
        char name[20]={"hello.txt"};

        JNIEXPORT jint JNICALL Java_com_example_soencryptiondemo_EncryptionSoClass_encrypt(JNIEnv * env, jobject obj, jint a, jint b)
        {
           return 1;
        }

        encrypt(name);

        }

我已将 .so 文件,即 libencprog.so 包含在我的 android 应用程序的 libs/armeabi-v7a 文件夹中。

加载.so文件的类如下

EncryptionSoClass.java

    package com.example.soencryptiondemo;

    public class EncryptionSoClass {
        /* load our native library */
        static {
            System.loadLibrary("libencprog");
        }

        public static native String encrypt(String filename);
    }

在我的 Android.mk 文件中我已经编写了代码

    LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)

    LOCAL_MODULE    := encprog
    LOCAL_SRC_FILES := encprog.c

    include $(BUILD_SHARED_LIBRARY)

我正在通过编写调用.so库的加密函数

         EncryptionSoClass.encrypt(Global.file_path + filename);

我收到以下错误

异常 Ljava/lang/UnsatisfiedLinkError;初始化 Lcom/example/soencryptiondemo/EncryptionSoClass 时抛出;

如果我缺少任何步骤,请告诉我..

我已经在 eclipse 中添加了对 c/c++ 的原生支持,并且还包含了 android ndk

【问题讨论】:

    标签: android c native-code


    【解决方案1】:

    您的 local_module 是 "LOCAL_MODULE := encprog" ,请如下所示,

     public class EncryptionSoClass {
        /* load our native library */
        static {
            System.loadLibrary("encprog");
        }
    
        public static native String encrypt(String filename);
    }
    

    【讨论】:

    • 它说 No implementation found for native Lcom/example/soencryptiondemo/EncryptionSoClass;.encrypt (Ljava/lang/String;)Ljava/lang/String;
    • 抱歉,我的答案发布后。我注意到你在 ndk 上做了一些不公平的事情,请更改“public native int encrypt(String filename);”在java中
    • encprog.c 文件中应该是,
    • 更改为公共本机 int 加密(字符串文件名);没有解决问题..与问题相同的错误:(
    • 你有问题,我会尽快通知你,请稍候
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 2020-11-20
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多