Android调用JNI的实现方法

概述

Android调用JNI库大致包括两种情况:

  • 提供Java接口和so库:
    这种类型的调用比较简单,要做的只是把so库放到APK或者Android系统中,之后在使用的时候调用对应的Java接口就行。JNI部分的代码提供商都写好了。
  • 只提供C/C++接口和so库:
    由于提供的算法库中并没有JNI部分的代码,所以我们需要自己写JNI代码,并在native方法中调用算法提供的接口。最终会产生两个so库,一个包含我们的native代码,另一个就是算法库。

本文主要对第一种调用情况进行实现,第二种调用情况涉及JNI具体代码的编写,目前未深入了解,想要了解第二种调用情况实现方式的伙伴可以参考博文:https://blog.csdn.net/EricFantastic/article/details/49300131

调用JNI接口的方法

  1. app -> build.gradle文件中的android -> defaultConfig下增加代码:
ndk.abiFilters 'arm64-v8a'
  1. app -> build.gradle文件中的buildscript -> dependencies下增加代码:
classpath 'com.nabilhachicha:android-native-dependencies:0.1.2'
  1. app -> build.gradle文件中增加代码:
apply plugin: 'android'
apply plugin: 'android-native-dependencies'
  1. app -> build.gradle文件中增加代码:
native_dependencies {
    
    
    artifact '.so fileName //下面语句为具体示例'
    artifact 'com.snappydb:snappydb-native:0.2.+:x86'
}
  1. 在代码中用于表征JNI的类中增加加载库的代码:
static {
    
    
	System.loadLibrary(".soFileName");
}
  1. 在上述类中声明JNI方法:
public native int init(int a, int b);
  1. 大功告成,之后就可以直接调用JNI方法了。

后记

  • 本文使用了android-native-dependencies,这是一个能够自动查找并下载JNILib库依赖到Android工程jniLibs目录的Android插件,感兴趣的伙伴可以自行了解。
  • jniLibs目录与libs目录的区别:主要是放的东西不同,.so库默认放在jniLibs目录下,.jar、.aar文件则放在libs目录下,如果将.so库放在libs里面,则需要进行重定向(告诉AndroidStudio该so文件在哪里),重定向语句:
sourceSets{
    
    
	main{
    
    
	jniLibs.srcDirs = [‘libs’]
	}
}
  • 上述代码ndk.abiFilters 'arm64-v8a'的含义可以参考文章:https://blog.csdn.net/xfb1989/article/details/111353782

猜你喜欢

转载自blog.csdn.net/weixin_46269688/article/details/128049694
今日推荐