Android NDK - 链接共享库和 JNI 包装器时出错

标签 android c android-ndk java-native-interface

我正在尝试链接我在不同的构建机器上使用 NDK-Standalone 工具链生成的共享库。然后使用特定的 .so 我将其放在 Android Studio 上。从那里,我使用 javah 创建了一个 jni.h 文件,然后它帮助我编写了用于函数调用的 .c JNI。

遵循此示例How do I compile any native (C, C++) library using NDK in the form of shared libraries .

ndk-build 确实编译并且似乎工作正常,但是当尝试在手机上运行该应用程序时,我收到错误

static { 
    System.loadLibrary("testLib")
}

说找不到testLib.so,即使它是生成的并且在libs/armeabi-v7a/testLib.so目录中

当前错误:

 01-31 14:41:53.779 19024-19024/com.jolopy.testing_02 E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.jolopy.testing_02, PID: 19024
        java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.jolopy.testing_02-2/base.apk"],nativeLibraryDirectories=[/data/app/com.jolopy.testing_02-2/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "testLib.so"
            at java.lang.Runtime.loadLibrary(Runtime.java:367)
            at java.lang.System.loadLibrary(System.java:1076)
            at com.jolopy.testing_02.TestLib.<clinit>(TestLib.java:6)
            at com.jolopy.testing_02.MainActivity.onCreate(MainActivity.java:18)

我如何构建 .so 文件:

arm-linux-androideabi-gcc -c -fPIC testLib.c -o test.o

arm-linux-androideabi-gcc test.o -o testing.so

从那里,我使用 javah 编写了一个 JNI 包装器类,它生成了 testing_Android.h 文件。从那里生成了testing_Android.c JNI包装器,我用它来调用我的testLib.c库中的函数:

#include "testLib.h"
//Including Machine Generated Header
#include "testing_Android.h"
#include <stdio.h>

JNIEXPORT void JNICALL Java_com_jolopy_testing_102_TestLib_testinglib_1Initialize
  (JNIEnv *env, jobject obj){
    (void)env;
    (void)obj;

    testing_Initialize();
}


JNIEXPORT jint JNICALL Java_com_jolopy_testing_102_TestLib_testinglib_1Get_1Count
  (JNIEnv *env, jobject obj){
    (void)env;
    (void)obj;

    return(testing_Get_Count());
}


JNIEXPORT jint JNICALL Java_com_jolopy_testing_102_TestLib_testinglib_1Get_1CurrentName
  (JNIEnv *env, jobject obj, jlong ptr, jint x){
    (void)env;
    (void)obj;

    return (testing_Get_CurrentName((char *)ptr , (int)x));

}

从那里我在 Android 的 jni 文件夹中有 5 个文件,这是我运行 ndk-build 命令的地方:

 testing.so | testing_Android.h | testing_Android.c | Application.mk | Android.mk

Android.mk:

LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := testLib
LOCAL_SRC_FILES := testing.so
LOCAL_EXPORT_C_INCLUDES := testing_Android.c
include $(PREBUILT_SHARED_LIBRARY)

应用程序.mk:

APP_PLATFORM := android-19
APP_ABI := armeabi-v7a

如果您在我的进步中发现了我没有发现的任何建议或错误,我们将不胜感激。

-干杯!

最佳答案

更改如下

APP_ABI := armeabi-v7a 

APP_ABI := arm64-v8a

因为从你的错误日志来看,你的设备是arm64 ABI。

<小时/>

如果你正在开始一个新的Android NDK项目,我建议你从Android Studio + CMake工具链开始,请参阅这里我个人基于Android Studio和CMake的JniExample项目:

关于Android NDK - 链接共享库和 JNI 包装器时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54468624/

相关文章:

Android cmake 不同的abi

JAVA移动设备-本地存储数据

c - 重新定义 C 错误的不兼容类型

python - 链接 docker 容器以组合不同的库

java - OpenGL ES 应用程序和运行 native Java 代码

android - 如何防止 NDK 将堆栈跟踪转储到 android logcat?

android - 如果无法处理404,我应该处理吗

java - Android 读写应用程序

c - 使用按位运算符在 C 中模拟浮点乘法

安卓工作室 :JNI DETECTED ERROR IN APPLICATION: native code passing in reference to invalid local reference: 0x200001