如何在另一个Android应用程序中调用Android ndk build.so文件?

如何在另一个Android应用程序中调用Android ndk build.so文件?,android,android-ndk,Android,Android Ndk,我有一个要求,我必须在Android中使用NDK构建.so文件,我必须在我的另一个Android应用程序中调用.so文件中的一些方法 到目前为止我都试过了 我已经从我的Android项目的lib文件夹中获取了.so文件,并将其放入我的另一个应用程序libs文件夹中,我应该称之为.so文件。我使用了以下代码: 注意:我正在使用ECLIPSE static { System.loadLibrary("NativeCode"); } 并尝试了完整的路径库 static {

我有一个要求,我必须在Android中使用
NDK
构建
.so
文件,我必须在我的另一个Android应用程序中调用
.so
文件中的一些方法

到目前为止我都试过了

我已经从我的Android项目的lib文件夹中获取了.so文件,并将其放入我的另一个应用程序libs文件夹中,我应该称之为.so文件。我使用了以下代码:

注意:我正在使用ECLIPSE

static {
        System.loadLibrary("NativeCode");
    }
并尝试了完整的路径库

static {
        System.loadLibrary("fullpath\NativeCode");
    }

在这两种情况下,它都给出了不满意的链接错误,这意味着它没有获取我的
.so
文件的路径。

您需要将
libNativeCode.so
放在根目录的
jni
文件夹中,而不是
libs
lib
文件夹中

下面是一个不错的教程:

或者,可以使用以下命令:

    adb shell
    $echo $PATH
它将显示如下路径:

/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin

您可以将您的
.so
放在以下任何文件夹中,如
/system
/system/bin
/system/sbin
。(请记住,但您需要手动复制,对于应用程序来说,这样做不是一个好主意)

编辑:
您不能在应用程序中调用任何JNI函数,因为签名无效。您需要有一个JNI包装器(一个
.so
JNI库,它反过来使用
.h
头文件来调用另一个库的JNI函数)。这是因为JNI对签名非常敏感。因此,正如我之前所建议的,请遵循教程

您需要将
libNativeCode.so
放在根目录的
jni
文件夹中,而不是放在
libs
lib
文件夹中

下面是一个不错的教程:

或者,可以使用以下命令:

    adb shell
    $echo $PATH
它将显示如下路径:

/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin

您可以将您的
.so
放在以下任何文件夹中,如
/system
/system/bin
/system/sbin
。(请记住,但您需要手动复制,对于应用程序来说,这样做不是一个好主意)

编辑:
您不能在应用程序中调用任何JNI函数,因为签名无效。您需要有一个JNI包装器(一个
.so
JNI库,它反过来使用
.h
头文件来调用另一个库的JNI函数)。这是因为JNI对签名非常敏感。因此,正如我之前所建议的,请遵循教程

要使用loadLibrary()加载.so库,必须将libNativeCode.solib复制到jniLibs/architecture文件夹中

该文件夹应位于Android应用程序模块(假设您使用的是Android Studio)的src/main/jniLibs/armeabi-v7a下

复制库后,将以下行添加到app module文件夹中的build.gradle:

assert file("./src/main/jniLibs/armeabi-v7a/libNativeCode.so").exists()
完成上述步骤后,应该正确加载库

如果libNativeCode.so位于错误的路径,Gradle构建将失败


祝你好运,

要使用loadLibrary()加载你的.so库,你必须将libNativeCode.so库复制到jniLibs/architecture文件夹中

该文件夹应位于Android应用程序模块(假设您使用的是Android Studio)的src/main/jniLibs/armeabi-v7a下

复制库后,将以下行添加到app module文件夹中的build.gradle:

assert file("./src/main/jniLibs/armeabi-v7a/libNativeCode.so").exists()
完成上述步骤后,应该正确加载库

如果libNativeCode.so位于错误的路径,Gradle构建将失败


祝你好运,

但这个例子只是说要构建一个android ndk应用程序,但我的问题是我已经有了一个.so文件如何在另一个android应用程序中使用它可能是或可能不是android ndk项目正如你所说,我将.so文件放在jni文件夹中,但不是working@AbhijitChakra编辑了我的答案。看一看,但这个例子只是说要构建一个android ndk应用程序,但我的问题是我已经有了一个.so文件如何在另一个android应用程序中使用它它可能是一个android ndk项目,也可能不是一个android ndk项目,正如你所说,我将.so文件放在jni文件夹中,但不是working@AbhijitChakra编辑了我的答案。看一看,嗨,这只适用于gradle版本。嗨,这只适用于gradle版本。