利用android studio 生成 JNI需要的动态库so文件
JNI: Java Native Interface, 提供了java语言和其他语言(例如c和c++)进行相互调用的方式。
本文是用java调用c生成的so模式。其中,编译so文件过程如下:
1)打开android studio, 新建一个空的

点击next, name中输入"test",点击finish。
创建完后,切换到project模式,显示如下:

2、编写带有native声明的java类
在test->app->src->main->java->com.sf.test目录,右键新建java类,名称为"Test"
双击Test,添加如下内容:
package com.sf.test;
public class Test {
public native void displayHelloWorld();
static {
System.loadLibrary("Test");
}
}
native方法 displayHelloWorld() 为我们在java中调用的函数,需要在c语言中重写来实现。
System.loadLibrary 后面跟的是动态库的名字。
3、利用javac编译成java类
右键com.sf.test.选择”open in terminal“,可以看见android studio底部出现终端调试助手,并且已经切换到相关目录下。
执行命令, javac Test.java
生成相应的class类(Test.class)
4、利用javac生成相应的h头文件
在main目录下新建jni文件夹,保存相关c和h文件,以及编译使用的文件。
命令为:
javac Test.java -h ../../../../jni (将生成的h文件保存到jni目录下)
此时可以查看到main/jni/目录下多了一个文件: com_sf_test_Test.h,头文件中内容为自动生成:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_sf_test_Test */ #ifndef _Included_com_sf_test_Test
#define _Included_com_sf_test_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_sf_test_Test
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_sf_test_Test_displayHelloWorld
(JNIEnv *, jobject); #ifdef __cplusplus
}
#endif
#endif 其中JNIEXPORT void JNICALL Java_com_sf_test_Test_displayHelloWorld
(JNIEnv *, jobject);为从java转换到c后的调用函数,对应Test.java中的 displayHelloWorld。 5、编写c语言的本地实现
在jni目录下添加test.c文件,其中内容为:
#include "jni.h"
#include "com_sf_test_Test.h" JNIEXPORT void JNICALL Java_com_sf_test_Test_displayHelloWorld
(JNIEnv *jv, jobject jo)
{
printf("Hello world\n");
return ;
} 两个头文件必须包含,下面函数的名称参数跟com_sf_test_Test.h中的必须一致。
6、编写ndk相关内容
jni目录下添加Android.mk和Application.mk文件
其中 Android.mk内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) LOCAL_MODULE := MyTest
LOCAL_SRC_FILES := test.c
include $(BUILD_SHARED_LIBRARY)
Application.mk内如如下:
APP_ABI := all
7、利用ndk进行编译
在jni目录下,输入命令 ndk-build,可以生成相关的so文件
[armeabi] Install : libMyTest.so => libs/armeabi/libMyTest.so
生成的文件保存子main/libs目录下 目前存在的问题,只生成了armeabi架构适用的so文件。其他平台如x86等适用的没有生成。
备注:
生成so文件可以通过两种编译方式:
1)cmake
2)ndk-build
利用android studio 生成 JNI需要的动态库so文件的更多相关文章
- Android studio 下JNI编程实例并生成so库
Android studio 下JNI编程实例并生成so库 因为公司需要为Android相机做美颜等图像后期处理,需要使用JNI编程,最近学了下JNI,并且在Android Studio下实现了一个小 ...
- Android Studio使用JNI
0x01 前言 本文讲述使用Android Studio通过静态注册.动态注册使用JNI的方法,以及加载第三方so文件的方法 0x02 Android Studio静态注册的方式使用JNI 1. 添加 ...
- 利用Android Studio编写 Android上的c与c++程序
利用Android Studio编写 Android上的c与c++程序 (2017-05-22 19:01:20) 转载▼ 标签: android 分类: Android开发 原文链接: http:/ ...
- 利用Android Studio、MAT对Android进行内存泄漏检测
利用Android Studio.MAT对Android进行内存泄漏检测 Android开发中难免会遇到各种内存泄漏,如果不及时发现处理,会导致出现内存越用越大,可能会因为内存泄漏导致出现各种奇怪的c ...
- Android Studio 生成 keystore 签名文件
Android Studio 生成 keystore 签名文件 常见 SSL 证书格式 : .DER .CER,文件是二进制格式,只保存证书,不保存私钥. .PEM,一般是文本格式,可保存证书,可保存 ...
- Android Studio生成javadoc出错的解决办法
一般使用Android Studio生成javadoc会有两个问题: 空指针异常 文档乱码 解决办法如下: 第1个问题:Tools --> Generate JavaDoc -->打开对话 ...
- Android Studio新建Jni工程
2.2版本的Android Studio支持新建Jni工程,不用再像以前自己构建工程目录,首先把自己的升级自己的AS到2.2以上 然后打开Tools->Andorid->SDK manag ...
- Android studio 配置JNI环境
Android studio配置jni开发环境,主要配置是两个build文件,以及新建一个jni文件,放c代码. 代码如下1: apply plugin: 'com.android.model.app ...
- Android Studio生成keystore签名文件步骤讲解
Android App打包时要用到签名文件,Android Studio生成签名文件步骤如下: Build---Generate Signed Apk...如图: 如果你的project中有2个或者2 ...
随机推荐
- Photoshop入门教程图解版
- PHP二维数组去重(指定键名)
本例对二维数组中某个指定键名进行去重,发现网上大多使用array_unique或是foreach遍历等方式去重,效果不佳且较为繁琐. 本文以二维数组去重为引,介绍array_column函数的三种用法 ...
- idea标注yml资源配置文件
- 【MySQL 读书笔记】当我们在使用索引的时候我们在做什么
我记得之前博客我也写过关于索引使用的文章,但是并不全面,这次尽量针对重点铺全面一点. 因为索引是数据引擎层的结构我们只针对最常见使用的 Innodb 使用的 B+Tree 搜索树结构进行介绍. 每一个 ...
- sql 查询 以结果集为对象左连接
- python3中的 zip()函数 和python2中的 zip()函数 的区别
python3中的 zip()函数 和python2中的 zip()函数 的区别: 描述: zip() 函数用于将可迭代对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象. ...
- js slice 假分页
语法 arrayObject.slice(start,end) 参数 描述 start 必需.规定从何处开始选取.如果是负数,那么它规定从数组尾部开始算起的位置.也就是说,-1 指最后一个元素,-2 ...
- rockchip 3128 平台USB接口鼠标U盘功能调试日记
2019-04-12 关键词: rk3128 OTG.rk3128外接鼠标U盘.RK外接鼠标U盘 本篇文章是笔者根据自己当前所掌握知识对 rk3128 平台 USB 接口接鼠标实现输入功能调试的一个记 ...
- ES6中6种声明变量的方法
相关阅读:http://es6.ruanyifeng.com/#docs/let 相关阅读:https://www.cnblogs.com/ksl666/p/5944718.html 相关阅读:htt ...
- java返回json设置自定义的格式
使用注解@JsonSerialize(using = CustomPriceSerialize.class) 创建自定义的格式化类(可为内部类) /** * 设置默认返回的小数类型(0.01 元) * ...