首先在此之前希望你已经掌握了基本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

#include

#include

#include "stdlib.h"

#include

//首先将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库的使用要简洁的多。

java调用so库中的native方法_Java如何调用本地.so库里的方法相关推荐

  1. java如何用c 的方法_JAVA如何调用C/C++方法

    JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能.解决JAVA对本地操作的一种方法就是JNI. JAVA通过JNI调用本地方法, ...

  2. java如何循环调用方法_Java:调用方法的“中断”循环?

    我的小程序有点问题. 我有一个JOptionPane要求一个数字,如果该数字小于10,则一个循环会一直持续下去,并永远做下去,继续询问数字. 在该循环内,我调用一个方法,将int作为参数. 在该方法中 ...

  3. java怎么调用方法_Java怎么调用类方法

    Java调用类方法的步骤:首先新建一个类,在调用类中先进行被调用类实例化:然后通过实例化的对象访问:最后新建一个类,将该类中需要被调用的方法设置为静态,加了static后,就可以用类名直接调用,格式为 ...

  4. java制作扫雷游戏中埋雷的难点_Java 实现经典扫雷游戏

    最后一次更新于 2019/07/08 效果演示图 Java 实现经典扫雷游戏 本扫雷游戏有以下功能: 如果点中炸弹会显示炸弹. 玩家左键点击方块能显示该方块周围会出现几个炸弹,如果不存在炸弹的话扫描范 ...

  5. java实现从excel中提取某行_Java读取excel表格(原理+实现)

    一般都是用poi技术去读取excel表格的,但是这个技术又是什么呢 什么是Apache POI? Apache POI是一种流行的API,它允许程序员使用Java程序创建,修改和显示MS Office ...

  6. java以下声明变量中 是不合法的_java考试复习题

    java考试复习题 人类的希望像是一颗永恒的星,乌云掩不住它的光芒.特别是在今天,和平不是一个理想,一个梦,它是万人的愿望.以下是小编为大家搜索整理的java考试复习题,希望能给大家带来帮助!更多精彩 ...

  7. java以下声明变量中 是不合法的_Java考试题(一)

    (1)下面程序的运算结果是(D) class DF { public static void main(String[] args) { String s="123"; Strin ...

  8. java 获取父类的方法_java 获取类和父类的属性和方法

    问题 在日常开发中,经常需要获取当前类和父类的所有属性,没办法只能查API了. getDeclaredFields VS getFields 查阅API得知,class.getDeclaredFiel ...

  9. java 调用父级方法_java子类调用父类的方法中包含子类重写的实例方法

    # 看题目是不是很绕,这个我也不知道怎么才能更简单的表达了 # 先看代码: public class Common { public static void main(String[] args) { ...

最新文章

  1. ubuntu python3.5安装_ubuntu16.04升级Python3.5到Python3.7的方法步骤
  2. 小孩都看得懂的YOLO!
  3. 服务器与客户端渲染(AngularJS与服务器端MVC)
  4. 沃尔玛控股中国1号店
  5. 【Guava】对Guava类库的注释类型 VisibleForTesting的理解
  6. SQL实战之查找所有已经分配部门的员工的last_name和first_name
  7. 我的第一个Imx6ULL应用《百度图像识别》
  8. 【STM32H7】第30章 ThreadX GUIX炫酷实用的时钟表盘设计,结合硬件RTC实时时钟
  9. vue 临时会话sessionStorage
  10. agx 安装ros opencv_ROS基础
  11. cuda 和 pytorch版本不一致torch.cuda.is_available()返回false——解决办法
  12. 短期学习目标2022/3/16
  13. uniapp发布为H5并部署运行
  14. 完成全球90万人工智能集装箱箱况残损检验,集装箱人工智能垂直领域领军者,中集集团人工智能企业中集飞瞳领跑全球港口航运人工智能AI
  15. 淘宝爬虫实战---requests库实现模拟登陆模块
  16. 推荐系统---缓存---人人网
  17. 面向对象三大特征之多态
  18. 2022-2028年中国打印机行业市场调查研究及前瞻分析报告
  19. java基础篇【完整版】
  20. 今年slam方向的同学秋招进展如何?

热门文章

  1. 下拉加载 实现 java_[Java教程]iscroll5实现一个下拉刷新上拉加载的效果
  2. android finish()传参数,48. (android开发) activity间传递数据(打开浏览器、拨号盘、传参)...
  3. linux开机自动启动(自启动)脚本、程序(初始化脚本)(海康摄像头自启动程序)
  4. linux下cmake-gui的安装
  5. python 字符串中使用制表符('\t')(或换行符('\n'))
  6. 【中级软考】测试用例 Test Case
  7. 网关是个啥?为什么电脑不设置网关就没法上网?笔记本为啥不用设置网关?
  8. 热插拔是什么?(Hot Swap hot-plugging hot plugging 带电插拔)USB热插拔
  9. python numpy:array、asarray、asanyarray的区别
  10. Moderate Modular Mode %,取模运算性质,数轴,思维