从不同的项目访问Android本机方法

时间:2018-04-25 18:39:06

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

我正在开发一个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。

请告知。

谢谢!

1 个答案:

答案 0 :(得分:0)

一般来说,在应用程序的MainActivity中使用本机方法并不是一个好主意,但现在我们正在努力解决这个问题,这不应该让我们担心。

假设您的新项目有com.example.other.MainActivity.java,并且您想要从com.example.androidlibcall.MainActivity.stringFromJNI()调用本机方法com.example.other.MainActivity.onCreate()。为此,请在其他应用中创建一个新的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 而无需重建它。