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

时间:2017-06-13 07:56:43

标签: java android java-native-interface shared-libraries native

我在这里查了一下,似乎没有回答我的具体问题。我知道我可以使用C .so库并通过稍微重写下面的库本机方法来引用其中的方法:

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

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

How to call methods on .so library in Android studio

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

问题:

  1. 您能否确认我不需要任何JNI文件来访问.so文件中的本机方法?
  2. 如上所述,实际上可以访问构造函数吗?如果可能的话,导入如何工作
  3. MAVEN / GRADLE - 对.so文件不起作用是否正确?它在gradle中也相当吗?
  4. 提前谢谢。

2 个答案:

答案 0 :(得分:2)

如果您有一个预先构建的 .so 文件,该文件实现了一些原生方法,那么您不需要其源代码来在Android Studio中构建项目。

问题是,包含这些方法的本机方法和类的名称是硬编码的,例如共享库中的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类或方法(有些工具可以使这种逆向工程更难)

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

Android Studio的Gradle插件会将src/main/jniLibs中的所以文件打包到您的APK中,除非您在 jniLibs.srcDir 目录>的build.gradle

答案 1 :(得分:0)

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

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

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