android java层通过jni加载使用第三方的so库
1、例如我们自己编译一个so库,我们的其他模块要加载如何操作了
首先在c盘新建立一个文件夹sb,在sb下面新建立一个文件夹jni,如果你要使用ndk编译so库,必须需要有jni目录
2、在jni目录下面建立下面几个文件
我们来看看c文件
//
// Created by wei.yuan on 2017/11/2.
//
#include<jni.h>
#include<logback_ecmapplication_cetcs_com_myapplicationkldsk_JNI.h>
#include <jni.h>
#include <string.h>
#include <pthread.h>
JNIEXPORT jstring JNICALL Java_logback_ecmapplication_cetcs_com_myapplicationkldsk_JNI_getStringFromC
(JNIEnv *env, jobject obj){
int *a = (int *) (NULL);
*a = ;
return (*env)->NewStringUTF(env,"I'm comes from 5454552444444to Native Function!");
}
然后是头文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity */ #ifndef _Included_logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity
#define _Included_logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_BIND_ABOVE_CLIENT
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_BIND_ABOVE_CLIENT 8L
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_BIND_ADJUST_WITH_ACTIVITY
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_BIND_ADJUST_WITH_ACTIVITY 128L
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_BIND_ALLOW_OOM_MANAGEMENT
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_BIND_ALLOW_OOM_MANAGEMENT 16L
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_BIND_AUTO_CREATE
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_BIND_AUTO_CREATE 1L
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_BIND_DEBUG_UNBIND
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_BIND_DEBUG_UNBIND 2L
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_BIND_IMPORTANT
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_BIND_IMPORTANT 64L
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_BIND_NOT_FOREGROUND
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_BIND_NOT_FOREGROUND 4L
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_BIND_WAIVE_PRIORITY
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_BIND_WAIVE_PRIORITY 32L
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_CONTEXT_IGNORE_SECURITY
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_CONTEXT_IGNORE_SECURITY 2L
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_CONTEXT_INCLUDE_CODE
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_CONTEXT_INCLUDE_CODE 1L
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_CONTEXT_RESTRICTED
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_CONTEXT_RESTRICTED 4L
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_MODE_APPEND
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_MODE_APPEND 32768L
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING 8L
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_MODE_MULTI_PROCESS
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_MODE_MULTI_PROCESS 4L
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_MODE_PRIVATE
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_MODE_PRIVATE 0L
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_MODE_WORLD_READABLE
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_MODE_WORLD_READABLE 1L
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_MODE_WORLD_WRITEABLE
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_MODE_WORLD_WRITEABLE 2L
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_DEFAULT_KEYS_DIALER
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_DEFAULT_KEYS_DIALER 1L
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_DEFAULT_KEYS_DISABLE
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_DEFAULT_KEYS_DISABLE 0L
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL 4L
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL 3L
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_DEFAULT_KEYS_SHORTCUT
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_DEFAULT_KEYS_SHORTCUT 2L
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_RESULT_CANCELED
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_RESULT_CANCELED 0L
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_RESULT_FIRST_USER
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_RESULT_FIRST_USER 1L
#undef logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_RESULT_OK
#define logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity_RESULT_OK -1L
/*
* Class: logback_ecmapplication_cetcs_com_myapplicationkldsk_MainActivity
* Method: getStringFromC
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_logback_ecmapplication_cetcs_com_myapplicationkldsk_JNI_getStringFromC
(JNIEnv *, jobject); #ifdef __cplusplus
}
#endif
#endif
现在我们要生成so库,需要配置android.mk文件和application.mk文化
android.mk文件内容如下所示:
ROOT_PATH := $(call my-dir) LOCAL_PATH := $(ROOT_PATH)
include $(CLEAR_VARS) LOCAL_MODULE := sb_jni
LOCAL_SRC_FILES := logback_ecmapplication_cetcs_com_myapplicationkldsk_JNI.c
LOCAL_CFLAGS := -Wl,-g
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
application.mk文件如下所示:
APP_STL := stlport_static
APP_ABI := all
APP_CXXFLAGS := -std=c++ -D__STDC_LIMIT_MACROS
APP_PLATFORM := android-
有了上面的配置之后,我们就可以在cgwin环境中生成对应的so库文件了,cgwin进入到对应的jni目录,使用ndk-build命令
编译成功之后会在jni的目录下产生下面的两个文件夹
libs文件下面的so库就是可以提高给第三方使用的so库,obj目录下生成的so库就是具有调试信息的so库,当发现奔溃的时候,可以使用工具arm-linux-androideabi-addr2line.exe解决该obj目录下的so库来定位文件
现在我们在android studio下面新建立一个工程
我们将上面的libs目录拷贝到工程和src同级别的目录下
然后在工程的gradle文件中配置下面的代码
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
完成的gradle代码如下
apply plugin: 'com.android.application' android {
compileSdkVersion
buildToolsVersion "24.0.2"
defaultConfig {
applicationId "cn.onlinecache.breakpad"
minSdkVersion
targetSdkVersion
versionCode
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
} buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
} dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile project(':breakpad') compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.jakewharton:butterknife:8.4.0'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
}
通过上面的配置,我们编译工程就会自动生成jNIlibs目录
然后我们要在代码中使用so库中的函数,如何使用了
JNIEXPORT jstring JNICALL Java_logback_ecmapplication_cetcs_com_myapplicationkldsk_JNI_getStringFromC
(JNIEnv *env, jobject obj){
int *a = (int *) (NULL);
*a = 1;
return (*env)->NewStringUTF(env,"I'm comes from 5454552444444to Native Function!");
} 从c语言中我们可以看出,这个函数是 通过JNI编程规范编写的,必须要满足JNI的编程规范,通过
JNIEXPORT jstring JNICALL Java_logback_ecmapplication_cetcs_com_myapplicationkldsk_JNI_getStringFromC我们可以知道对应该函数的java层对应的
包名是
logback.ecmapplication.cetcs.com.myapplicationkldsk
对应的类名是JNI,对应的函数名是
getStringFromC
所以我们在工程中应该要建立下面的这样一个文件
package logback.ecmapplication.cetcs.com.myapplicationkldsk; /**
* Created by wei.yuan on 2017/11/13.
*/ public class JNI {
public native String getStringFromC();
static {
System.loadLibrary("sb_jni");
}
}
在这个文件中加载so 库进行调用
调用者:
new JNI().getStringFromC()
工程结构如下:
工程项目代码如下所示:
http://pan.baidu.com/s/1nvHuufB
android java层通过jni加载使用第三方的so库的更多相关文章
- Android开发实践:Java层与Jni层的数组传递
转载:http://www.linuxidc.com/Linux/2014-03/97561.htm Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是 ...
- Android开发中如何解决加载大图片时内存溢出的问题
Android开发中如何解决加载大图片时内存溢出的问题 在Android开发过程中,我们经常会遇到加载的图片过大导致内存溢出的问题,其实类似这样的问题已经屡见不鲜了,下面将一些好的解决方案分享给 ...
- Android引入高速缓存的异步加载全分辨率
Android引进高速缓存的异步加载全分辨率 为什么要缓存 通过图像缩放,我们这样做是对的异步加载优化的大图,但现在的App这不仅是一款高清大图.图.动不动就是图文混排.以图代文,假设这些图片都载入到 ...
- Java层与Jni层的数组传递(转)
源:Java层与Jni层的数组传递 Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的S ...
- Android三种基本的加载网络图片方式(转)
Android三种基本的加载网络图片方式,包括普通加载网络方式.用ImageLoader加载图片.用Volley加载图片. 1. [代码]普通加载网络方式 ? 1 2 3 4 5 6 7 8 9 10 ...
- Android ViewPager Fragment使用懒加载提升性能
Android ViewPager Fragment使用懒加载提升性能 Fragment在如今的Android开发中越来越普遍,但是当ViewPager结合Fragment时候,由于Androi ...
- Android Phonebook编写联系人UI加载及联系人保存流程(一)
2014-01-06 17:05:11 将百度空间里的东西移过来. 本文适合ROM定制做Phonebook的童鞋看,其他人飘过即可- Phonebook添加/编辑联系人UI加载及保存联系人流程,是一系 ...
- java在windows下加载dll
java在类中加载动态链接库文件. 类文件中: static { System.loadLibrary("dll文件"); } dll文件在工程的包路径下.例如:pro/bin/h ...
- JQuery浮动层Loading页面加载特效
之前做项目,经常需要一些浮动层加载Loading. 现在好多前端框架都能实现了,最常用的就是 artDialog 下面记录下当时的代码. <!DOCTYPE html PUBLIC " ...
随机推荐
- Orcle 查询语句
首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott ac ...
- PAT1090 危险品装箱 (25分) ——值得留意的map用法(int型与vector型的关联)
1090 危险品装箱 (25分) 集装箱运输货物时,我们必须特别小心,不能把不相容的货物装在一只箱子里.比如氧化剂绝对不能跟易燃液体同箱,否则很容易造成爆炸. 本题给定一张不相容物品的清单,需要你 ...
- Java实现 LeetCode 822 翻转卡片游戏(暴力)
822. 翻转卡片游戏 在桌子上有 N 张卡片,每张卡片的正面和背面都写着一个正数(正面与背面上的数有可能不一样). 我们可以先翻转任意张卡片,然后选择其中一张卡片. 如果选中的那张卡片背面的数字 X ...
- Java实现 LeetCode 600 不含连续1的非负整数(有些题为了避免使用位运算可以换成动态规划)
600. 不含连续1的非负整数 给定一个正整数 n,找出小于或等于 n 的非负整数中,其二进制表示不包含 连续的1 的个数. 示例 1: 输入: 5 输出: 5 解释: 下面是带有相应二进制表示的非负 ...
- java实现顺时针螺旋填入
从键盘输入一个整数(1~20) 则以该数字为矩阵的大小,把 1,2,3-n*n 的数字按照顺时针螺旋的形式填入其中.例如: 输入数字 2,则程序输出: 1 2 4 3 输入数字 3,则程序输出: 1 ...
- org.openqa.selenium.WebDriverException: It is impossible to create a new session because 'createSession' which takes HttpClient, InputStream and long was not found or it is not accessible 异常
检查项目配置的jdk版本是否过低,修改一下配置就解决了.如果是jdk版本过低的就升级一下jdk.
- Elasticsearch系列---生产集群部署(下)
概要 本篇继续讲解Elasticsearch集群部署的细节问题 集群重启问题 如果我们的Elasticsearch集群做了一些离线的维护操作时,如扩容磁盘,升级版本等,需要对集群进行启动,节点数较多时 ...
- 第二个hibernate Annotation版本的helloworld
经过第一次的 hibernate 我发现每一个数据库表都对应了一个类,并且每一个类都要新建一个文件进行配置 很麻烦! 于是便出现了Annotation版本的hibernate. 具体如下: 1.同 ...
- k8s学习-安全
4.8.安全 4.8.1.概念 一些内容可参考4.6.2.Secret的内容 说明 Kubernetes 作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务.API Server 是集群 ...
- linux中c多线程同步方法
https://blog.csdn.net/jkx01whg/article/details/78119189 Linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. 一.互斥 ...