利用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 __cplusplusextern "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 := MyTestLOCAL_SRC_FILES := test.cinclude $(BUILD_SHARED_LIBRARY)
Application.mk内如如下:
APP_ABI := all7、利用ndk进行编译在jni目录下,输入命令 ndk-build,可以生成相关的so文件[armeabi] Install : libMyTest.so => libs/armeabi/libMyTest.so生成的文件保存子main/libs目录下 目前存在的问题,只生成了armeabi架构适用的so文件。其他平台如x86等适用的没有生成。
备注:生成so文件可以通过两种编译方式:1)cmake2)ndk-build
转载于:https://www.cnblogs.com/rohens-hbg/p/10676681.html
利用android studio 生成 JNI需要的动态库so文件相关推荐
- 将java编译成so库_利用android studio 生成 JNI需要的动态库so文件
JNI: Java Native Interface, 提供了java语言和其他语言(例如c和c++)进行相互调用的方式. 本文是用java调用c生成的so模式.其中,编译so文件过程如下: 1) ...
- android studio生成Jni头文件 java10,java11删除了javah,改用javac直接用源码生成jni头文件。 java8是用javah
android studio生成Jni头文件 鼠标放本地方法上去,点提示来创建. java10,java11及以上 生成jni头文件 java10,java11删除了javah.改用javac直接 ...
- 【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )
文章目录 I . 动态库 与 静态库 II . 编译动态库 III. Android Studio 使用第三方动态库 IV . Android Studio 关键代码 V . 博客资源 I . 动态库 ...
- 借助Android Studio生成图标(图片)drawable文件夹下的xml文件
目录 一.准备图标或者图片 二.AS新建Vector Asset 如标题所示,借助Android Studio生成图标(图片)的xml文件,存放在drawable文件夹下. 一.准备图标或者图片 本人 ...
- 利用Android Studio的 Monitor Memory 查找内存泄漏
App开发总会遇到内存泄漏的情况,在Eclipse时代我们一般使用MAT来配合分析,Android Studio会方便一些,因为它自带了一个Monitor Memory.下面我们来看看怎么使用这个工具 ...
- android内存溢出错误,Android Studio 生成 JavaDoc 空指针异常|文档编码出错|内存溢出...
一般使用Android Studio生成 JavaDoc会有三个问题: 1.空指针异常 Tools --> Generate JavaDoc -->打开对话框活,在"Other ...
- [安卓开发笔记二]android Studio通过jni调用C++代码
[安卓开发笔记二]android Studio通过jni调用C++代码 16/12/11 更新 此博客基于安卓android studio 1.5所写,现在已经有了android studio2.2的 ...
- Android开发基础:利用 Android Studio开发看美女应用(4)
利用 Android Studio开发看美女应用 今天我们会利用 Android Studio开发一个简单的看美女应用,通过它查看互联网上的美女图片.通过本篇文章,你将会学到Android应用简单开发 ...
- android studio生产签名文件,Android Studio 生成 keystore 签名文件
Android Studio 生成 keystore 签名文件 常见 SSL 证书格式 : .DER .CER,文件是二进制格式,只保存证书,不保存私钥. .PEM,一般是文本格式,可保存证书,可保存 ...
最新文章
- 世博会、新三国、新红楼
- pta l2-7(家庭房产)
- 分拣外观残缺的机器人_中国鞋业高峰论坛大咖云集,国辰机器人解读“鞋业智造”...
- 第七十五期:网络 | 5G那些运营商不愿说的秘密
- 设置ORACLE_HOME环境变量
- java验证cron表达式_cron表达式
- leetcode59题:滑动窗口的最大值(用双端队列实现)
- 若依集成aj-captcha实现滑块验证码(单体版)
- 一文带你了解Java反射机制
- 一个关于反序列化的小问题
- 有没有更好的写v =(v == 0?1:0)的方法; [关闭]
- jsp 设置404页面
- python之requests模块
- Tomcat无法成功启动startup.bat解决方法(闪退)
- 如何在微软的下载商店找到下载的图片?
- 60级神圣系圣骑心得(转)
- python练习-prat1
- vue2 mapEchart示例
- C++-对于一个频繁使用的短小函数,应该使用什么来实现?有什么优缺点?
- 【html+css】
热门文章
- 洛谷4400 BlueMary的旅行(分层图+最大流)
- learn_Day14 内置函数补充、反射、初识面向对象
- Web---JSP-EL表达式
- 正则表达式是匹配模式,要么匹配字符,要么匹配位置
- input输入框修改placeholder和readonly的样式
- JS数组reduce()方法
- php curl 批量,PHP实现的curl批量请求操作
- python中digits什么意思_在Caffe中使用 DIGITS自定义Python层
- Tomcat配置https访问SSL证书(pfx文件)
- zkui - Zookeeper的Web UI界面 windows环境