【问题标题】:accessing Android native method from different project从不同的项目访问 Android 本机方法
【发布时间】:2023-04-05 19:42:01
【问题描述】:

我正在开发一个 Android 应用程序,它将调用由不同的 Android NDK 应用程序创建的 .so 文件。

我在我的项目中创建了以下文件夹结构并复制了 .so 文件,如下所示:

|--app: 
|--|--src: 
|--|--|--main 
|--|--|--|--jniLibs 
|--|--|--|--|--armeabi 
|--|--|--|--|--|--libmylib.so 
|--|--|--|--|--x86
|--|--|--|--|--|--libmylib.so

我通过我的应用程序通过以下代码调用这个库:

static {

        System.loadLibrary("mylib");
    }

然后我通过以下代码从这个共享对象调用方法:

String str = stringFromJNI();

这不起作用,因为程序会按如下方式查找损坏的函数名称:

com.example.androidlibcall.MainActivity.stringFromJNI() 我的 .so 函数将使用不同的包名称,因此会生成不同的函数名称。 我不太确定从外部库调用函数需要做什么,我假设我可以创建自己的库并利用 dlopen() 加载外部库并对其进行调用,但想知道是否有是否有其他方法来实现这一点。

我的最终目标是能够创建可以调用移动设备上预先存在的库的应用程序,但是由于我是 NDK/Android 的新手,我不确定什么是最好的方法并且还没有找到了可以使用的好例子。 许多先前存在的类似问题似乎都在处理似乎不再适用的旧版 Android Studio。

我在 Windows 7 机器上使用最新版本的 Android Studio (3.1.2) 和 Gradle 4.4。

请指教。

谢谢!

【问题讨论】:

    标签: android-studio android-ndk java-native-interface


    【解决方案1】:

    一般来说,在应用程序的 MainActivity 中包含本地方法并不是一个好主意,但是现在我们正在制定一种解决方法,这不应该让我们担心。

    假设您的新项目有com.example.other.MainActivity.java,并且您想从com.example.other.MainActivity.onCreate() 调用本机方法com.example.androidlibcall.MainActivity.stringFromJNI()。为此,请在您的其他应用程序中创建一个新的 Java 类:

    package com.example.androidlibcall;
    
    public class MainActivity {
        public static native String stringFromJNI();
    }
    

    在您现有的 MainActivity 类中,

    package com.example.other;
    
    import static com.example.androidlibcall.MainActivity.stringFromJNI;
    
    class MainActivity {
        static {
            System.loadLibrary("mylib");
        }
    }
    
    public class MainActivity extends Activity {
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            …
            String qq = stringFromJNI();
            …
        }
    }
    

    您会看到 com/example/androidlibcall/MainActivity.java 不包含任何逻辑、数据和代码。它只是一个包装器,让我们无需重新构建即可轻松使用 libmylib.so

    【讨论】:

    • 感谢 Alex 的回复,但是我无法访问 Android Studio 中的共享对象。我不确定我是否将 .so 文件放在了正确的位置,或者我是否需要对任何特定的构建文件进行修改。我理解的 Java 代码,但 Studio 没有看到我放置在项目中的 .so 文件。此外,我的最终目标是访问 .so 文件而无需访问其源代码,因此解决方案需要独立于我将使用的 .so 文件的实际源代码。如果您有任何进一步的建议/想法,请告诉我。谢谢!
    • 你写,我的最终目标是能够创建可以调用移动设备上预先存在的库的应用程序,即你不期望这个库打包到您的 APK 中。因此,将 POC 库复制到手机,并尝试从 Java 加载它,并提供完整路径。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多