的Android调用LoadLibrary是.so调用方法和构造

问题描述:

我在这里检查,这似乎是对我的特殊问题没有答案。我知道,我可以用C .so库,并通过重写有点像下面的库的本地方法是指在它的方法:的Android调用LoadLibrary是.so调用方法和构造

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

我probelem是,我想调用这个构造函数库。的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中也是等价的吗?

在此先感谢您。

+1

创建JNI包装代码并使用extern“C”将其导出。叫你基于C语言代码和里面参考C++之一。例如。创建C++对象。 – mko

如果您有一个预构建的.so文件,它实现了一些本地方法,您不需要它的源代码就可以在Android Studio中构建项目。

问题在于包含这些方法的本地方法和类的名称是硬编码的,例如,在一个共享库libmy.soJava_com_example_test_MainActivity_stringFromJNI导出函数拟合到

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

而不是其它的Java类或方法(有工具使这种逆向工程硬)

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

摇篮插件为Android Studio将打包所以文件从src/main/jniLibs到您的APK,除非你在的build.gradle设置不同的jniLibs.srcDir目录。

+0

谢谢。我想我需要用我自己的JNI编写一个CPP类,并在其中包含h文件。(我有,我只是没有C文件)这是非常棘手的,因为这是我第一次接触C/C++。 “使用javah为我的本地方法生成C声明”是什么意思?那会给我什么?我的Java文件的C版本?再次感谢您的回答。 –

+1

** javah **可以为您提供包含'样板文件'的.h和.c文件,用于在您的Java文件中声明的本机方法。 –

我不知道这是否是你在找什么,但看看这里:

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

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

+0

谢谢...这是普通的java,我看你不使用@Alex Cohn发布的命名约定,在上面的答案中。这不是必须的吗? –