Android loadLibrary .so 调用方法和构造函数

Android loadLibrary .so calling methods and constructor

我已经在这里查看过了,但似乎无法回答我的特定问题。我知道我可以使用 C .so 库并通过某种方式覆盖库本机方法来引用其中的方法,如下所示:

@SuppressWarnings("JniMissingFunction")
    public class MyNativeMethods {
    static {
        System.loadLibrary("libraryWithSoExtension");
}
public native boolean init();
} 

我的问题是我想调用这个库中的构造函数。该库仅包含几个 类,其中每个包含 1 或 2 个方法。我从这里看到:

我不需要任何 h、c 或 jni(真的吗?)。

问题:

  1. 你能确认我不需要任何 JNI 文件来访问 .so 文件中的本机方法吗?
  2. 实际上可以访问如上所述的构造函数吗?如果可能的话,导入是如何工作的
  3. MAVEN/GRADLE - a 不适用于 .so 文件是否正确?它在 gradle 中也等效吗?

提前致谢。

我不确定这是否是您要找的,但请看这里:

https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo025

你会发现那里有超级简单的代码,其中 C++ 通过 JNI 包装器从 Java 调用。

如果您有预构建的 .so 文件实现了一些本机方法,则不需要其源代码即可在 Android Studio 中构建您的项目。

要注意的是,本机方法的名称和包含这些方法的 classes 是硬编码的,例如Java_com_example_test_MainActivity_stringFromJNI 共享库中的导出函数 libmy.so 适合

package com.example.test;
public class MainActivity extends Activity {
  static {
    System.loadLibrary("my");
  }
  public native String stringFromJNI();
}

而不是其他一些 Java class 或方法 (有一些工具可以使这种逆向工程更难)

您可以使用 javah 命令为您的本地方法生成 C 声明,但它不能对适合给定库的 Java class 进行逆向工程。但它会让你声明一个本地构造函数,如果你真的想要的话。

Gradle Android Studio 插件会将 so 文件从 src/main/jniLibs 打包到您的 APK 中,除非您设置不同的 jniLibs.srcDir 目录在你的 build.gradle.