【问题标题】:Could not load native library jni_latinime.so Android无法加载原生库 jni_latinime.so Android
【发布时间】:2017-01-20 13:24:23
【问题描述】:

它给出错误并且无法加载 .so 文件。我在互联网上搜索并阅读了很多内容,但没有找到答案。我尝试使用 System.loadLibrary("jni_latinime") 但它再次失败。请给我任何建议。谢谢。

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.android.inputmethod.latin-1/base.apk"],nativeLibraryDirectories=[/data/app/com.android.inputmethod.latin-1/lib/arm, /vendor/lib, /system/lib]]] couldn't find "libjni_latinime.so"
                                                                         at java.lang.Runtime.loadLibrary(Runtime.java:367)
                                                                         at java.lang.System.loadLibrary(System.java:1076)
                                                                         at com.android.inputmethod.latin.utils.JniUtils.<clinit>(JniUtils.java:33)
                                                                         at com.android.inputmethod.latin.utils.JniUtils.loadNativeLibrary(JniUtils.java:46)
                                                                         at com.android.inputmethod.latin.LatinIME.<clinit>(LatinIME.java:599)
                                                                         at java.lang.Class.newInstance(Native Method)
                                                                         at android.app.ActivityThread.handleCreateService(ActivityThread.java:2877)
                                                                         at android.app.ActivityThread.-wrap4(ActivityThread.java)
                                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1437)
                                                                         at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                         at android.os.Looper.loop(Looper.java:148)
                                                                         at android.app.ActivityThread.main(ActivityThread.java:5443)
                                                                         at java.lang.reflect.Method.invoke(Native Method)
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

【问题讨论】:

    标签: android android-ndk android-gradle-plugin


    【解决方案1】:

    1.设置NDK PATH

    2.在 build.gradle 中添加这个

     sourceSets.main {
             jni.srcDirs = []
              jniLibs.srcDir 'src/main/libs'
         }
    

    3.在SRC目录中创建一个Jni文件夹

    4.Create- Android.mk--inside jni 文件夹-

    5.在Android.mk文件中添加

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE    := "module name"//added inside system.load(); ** i used addjni**
    
    LOCAL_SRC_FILES := Native.c   //create a native.c class
    LOCAL_LDLIBS := -llog -ljnigraphics
    include $(BUILD_SHARED_LIBRARY)
    

    6.创建文件Application.mk---在jni文件夹中--- 并写下这个

      APP_ABI := all
    

    7.在 MainActivity 中添加

     public class MainActivity extends AppCompatActivity {
    
     static {
         System.loadLibrary("addjni");
     }
     TextView sum;
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         sum=(TextView)findViewById(R.id.sum);
         int as=Native.sumoftwo(210,15);
         Log.e("sum",as+"");
         sum.setText(as+"");
    
     }
    

    }

    8.新建NativeNDK.c

    //在jni文件夹里面添加这个 //jave_packageName_Native(Classname)_(methodname) replace(.with -)

     include<string.h>
     include<jni.h>
     jint JNICALL Java_droider_Native_sumoftwo(JNIEnv*  env , jclass obj,jint   a,jint b)   
    
          {
            jint total=(a+b);
             return total;
           }
    

    9.转到工作室终端并在里面输入命令

    cd app\src\main>D:\android-ndk-r10d\android-ndk-r10d\ndk-build APP_PLATFORM=android-8 进入

    10. main/src 中的 Native.c

     public class Native {
           public native static int sumoftwo(int a,int b);
            static {
                    System.loadLibrary("addjni");
            } 
        }
    

    11.从库中复制所有.so,如果存在则粘贴到jinLibs中,否则创建并粘贴

    【讨论】:

    • 在执行 9 步时被拒绝访问
    • 如果成功则进入 app/main(NDK 的位置)就像我在 D 盘中一样,最后粘贴 APP_PLATFORM=android-8
    【解决方案2】:

    转到 LatinIME/native/jni 并使用 ndk-build 构建它..

    (如果它包含错误,只需打开 Android.mk 并评论此行:

        # LOCAL_CFLAGS += -Werror -Wall -Wextra -Weffc++ -Wformat=2 -Wcast-qual -Wcast-align \
        #     -Wwrite-strings -Wfloat-equal -Wpointer-arith -Winit-self -Wredundant-decls \
        #     -Woverloaded-virtual -Wsign-promo -Wno-system-headers
    

    这将构建 jni_latinime.so 文件... 您可以通过提供以下代码将其添加到您的 build.gradle:

    sourceSets {
        main {
            jniLibs.srcDirs = ['LOCATION OF .so File']
        }
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2011-09-06
    • 1970-01-01
    • 2019-07-09
    • 2018-05-29
    • 2016-09-19
    相关资源
    最近更新 更多