利用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 ...
随机推荐
- Http和Https有什么区别
以前去面试的时候,好几家公司都会问到这个问题:http和https有什么区别? 最近突然想恶补一些基础,再夯实一下自己实力,毕竟强大的能力才是工资的保证嘛,今天就来简单记录一下htttp和https的 ...
- centos7之zabbix的web检测
一.web监控 Web scenarios(Web 场景)是用来监控Web程序的,可以监控到Web程序的下载速度.返回码及响应时间,还支持把一组连续的Web动作作为一个整体进行监控. 1.web监控的 ...
- MySQL中怎么对varchar类型排序问题(转)
在mysql默认order by 只对数字与日期类型可以排序,但对于varchar字符型类型排序好像没有用了,下面我来给各位同学介绍varchar类型排序问题如何解决. 今天在对国家电话号码表进行 ...
- bugku crypto easy-crypto
长度不一的01字符串 就要考虑是不是摩斯密码 用这个py脚本: from __future__ import print_function a = input("input the stri ...
- [LOJ3084][GXOI/GZOI2019]宝牌一大堆——DP
题目链接: [GXOI/GZOI2019]宝牌一大堆 求最大值容易想到$DP$,但如果将$7$种和牌都考虑进来的话,$DP$状态不好设,我们将比较特殊的七小对和国士无双单独求,其他的进行$DP$. 观 ...
- Django_rest framework 框架介绍
restful介绍 restful协议 一切皆是资源,操作只是请求方式 URL 设计 原先的URL设计方式 在url 中体现出操作行为 /books/ books /books/add/ addbo ...
- DRF 商城项目 - 用户( 登录, 注册,登出,个人中心 ) 逻辑梳理
用户登录 自定义用户登录字段处理 用户的登录时通过 手机号也可以进行登录 需要重写登录验证逻辑 from django.contrib.auth.backends import ModelBacken ...
- Re.多项式求逆
前言 emmm暂无 多项式求逆目的 顾名思义 就是求出一个多项式的摸xn时的逆 给定一个多项式F(x),请求出一个多项式G(x),满足F(x)∗G(x)≡1(modxn),系数对998244353取模 ...
- Java基础 -- 深入理解泛型
一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义的类.如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大. 而泛型很好的解决了这个问题,这也是Java SE5的重大 ...
- consul实现分布式锁
分布式一致性问题: 分布式的CAP理论告诉我们"任何一个分布式系统都无法同时满足一致性(Consistency).可用性(Availability)和分区容错性(Partition tole ...