我已经在src / main中创建了JNI文件夹,并使用javah成功生成了c头文件。然后,我将其实现如下:

#include <jni.h>
#include <string.h>

JNIEXPORT jstring JNICALL Java_com_kxiaozao_kxz_KXZSDK_KXZSDKInterface_encode (JNIEnv *env, jobject thisz, jstring jsonString) {
    return (*env)->NewStringUTF(env, "Hello from JNI !");
}


而我的Android.mk文件是:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := kxz_encoder
LOCAL_SRC_FILES := kxz_encoder.c
include $(BUILD_SHARED_LIBRARY)


运行ndk-build后,在libs / armeabi内部生成.so文件

另外,我在活动中添加了以下几行。

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


在Kitkat上运行时,此应用程序崩溃,并显示以下错误:

java.lang.UnsatisfiedLinkError: Couldn't load kxz_encoder from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.kxiaozao.kxz-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.kxiaozao.kxz-2, /vendor/lib, /system/lib]]]: findLibrary returned null
            at java.lang.Runtime.loadLibrary(Runtime.java:358)
            at java.lang.System.loadLibrary(System.java:526)
            at com.kxiaozao.kxz.KXZFrontEnd.ViewController.KXZRecommendationVC.<clinit>(KXZRecommendationVC.java:258)
            at java.lang.reflect.Constructor.newInstance(Native Method)
            at java.lang.Class.newInstance(Class.java:1559)
            at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2101)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
            at android.app.ActivityThread.access$800(ActivityThread.java:135)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5001)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)


我检查了Runtime.java内部发生错误的函数

void loadLibrary(String libraryName, ClassLoader loader) {
        if (loader != null) {
            String filename = loader.findLibrary(libraryName);
            if (filename == null) {
                throw new UnsatisfiedLinkError("Couldn't load " + libraryName +
                                               " from loader " + loader +
                                               ": findLibrary returned null");
            }
            String error = doLoad(filename, loader);
            if (error != null) {
                throw new UnsatisfiedLinkError(error);
            }
            return;
        }

        String filename = System.mapLibraryName(libraryName);
        List<String> candidates = new ArrayList<String>();
        String lastError = null;
        for (String directory : mLibPaths) {
            String candidate = directory + filename;
            candidates.add(candidate);

            if (IoUtils.canOpenReadOnly(candidate)) {
                String error = doLoad(candidate, loader);
                if (error == null) {
                    return; // We successfully loaded the library. Job done.
                }
                lastError = error;
            }
        }

        if (lastError != null) {
            throw new UnsatisfiedLinkError(lastError);
        }
        throw new UnsatisfiedLinkError("Library " + libraryName + " not found; tried " + candidates);
    }


似乎在第三行中,filename是null。谁能帮我解决这个问题?
谢谢!

最佳答案

当前版本的android studio不提供NDK支持。您可以参考以下链接。
https://developer.android.com/sdk/installing/studio.html

关于android - Android Studio NDK无法加载库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25396619/

10-11 22:40
查看更多