Java如何调用本地.so库里的方法

首先在此之前希望你已经掌握了基本JNI常识的运用,比如Java代码如何调用本地native的方法,native方法如何访问本地变量,本地方法等以及其他相关的基础知识。在此我还是贴上Activity的部分代码,如下:

// Used to load the 'native-lib' library on application startup.
  static {
    System.loadLibrary("native-lib");
  }
  public String name = "test";
  private int source[] = { 1, 4, 0, 7, 33, 11 };
@Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Example of a call to a native method
    TextView tv = (TextView) findViewById(R.id.sample_text);
    tv.setText(stringFromJNI());
    }
  /**
   * A native method that is implemented by the 'native-lib' native library,
   * which is packaged with this application.
   */
  public native String stringFromJNI();

  public native String updateNameFromC();//属性访问

  public native String getMethod();//方法访问

  public native void getArray(int arrays[]);

  //引用解决什么问题呢,什么时候通知JVM回收JNI的对象
  public native void getLocalReference();

  //缓存策略,对象生命周期的问题
  public native void cachede();

  //测试
  public native String test(String str);

同理,本地cpp的代码如下:

#include <jni.h>
#include <string>
#include <string.h>
#include "stdlib.h"
#include <android/log.h>
//首先将a强制声明为指向整数的指针,然后读取指针对应的整数
int compare(const void *a,const void *b){
    return (*(int *)a-*(int *)b);
}

#define TAG "myDemo-jni" // 这个是自定义的LOG的标识
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__) // 定义LOGD类型
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG ,__VA_ARGS__) // 定义LOGI类型
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,TAG ,__VA_ARGS__) // 定义LOGW类型
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG ,__VA_ARGS__) // 定义LOGE类型
#define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,TAG ,__VA_ARGS__) // 定义LOGF类型


extern "C"
JNIEXPORT jstring
JNICALL
Java_com_example_ee_ndkdemo_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

运行程序,则会发现在下面的目录中生成了不同的.so库,如下:


20180519164954.png

好的,第一步已经完成。
其次,新建一个项目,将其不同的.so库拷贝到项目的目录下,这里有两种方法,第一种,将.so库拷贝到项目src->main->jniLibs下,不同的架构放在这个目录的不同文件夹下面即可,这是最简单的;第二种,将.so库拷贝到项目app->libs中,不同的架构放在这个目录的不同文件夹下面即可,但是这时候要在build.gradle中配置

rceSets{ 
main{ 
jniLibs.srcDirs = ['libs'] 
} 
}

这时候就会涉及到如何引用.so库里面的方法了,其实调用So库里的方法也有两种方式:
(1)So库有对应的jar包,把jar包放进libs里就可以调用so库里面的方法了,当然得先把so放进jniLibs里;
(2)只有So库,没有jar包,下面详细讨论这种情况…..
没有jar包又想调用so里的方法,其实也是很简单的,前提当然是要把so库放进jniLibs里,然后看下面的代码

public class MainActivity {
  static {
    System.loadLibrary("native-lib");
  }

  public String hh(){
    return stringFromJNI();
  }
  
  public  static native String stringFromJNI();
  public  static native String getMethod();
}

实际上我这是希望在另外一个项目中调用之前打包成so库的本地方法
stringFromJNI(),事实上中间有一个必须要注意的细节,就是调用已经打包so库的那个类,必须要与已经生成的so库的类名,包名都要一致,否则就会出现问题,这是一个细节。所以笔者最后发现只有so库的调用实际上还是相对麻烦一下,因为你要调用的一些第三方的so库,比人不会告诉你他们的报名,已经加载这个so库所在的类名。相反例如百度推送以及七牛云等相关的so库,别人会额外再提供你一个相关的jar包,我们只需要操作jar包就Ok了,所以最终我认为对第三方so库里面方法的调用,so库配jar包的使用比单纯的so库的使用要简洁的多。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,158评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,600评论 1 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,785评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,655评论 0 220
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,075评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,002评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,146评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,918评论 0 211
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,671评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,838评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,318评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,636评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,343评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,187评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,982评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,126评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,934评论 2 279

推荐阅读更多精彩内容