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文件相关推荐

  1. 将java编译成so库_利用android studio 生成 JNI需要的动态库so文件

    JNI:  Java Native Interface,  提供了java语言和其他语言(例如c和c++)进行相互调用的方式. 本文是用java调用c生成的so模式.其中,编译so文件过程如下: 1) ...

  2. android studio生成Jni头文件 java10,java11删除了javah,改用javac直接用源码生成jni头文件。 java8是用javah

    android studio生成Jni头文件 鼠标放本地方法上去,点提示来创建. java10,java11及以上   生成jni头文件 java10,java11删除了javah.改用javac直接 ...

  3. 【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )

    文章目录 I . 动态库 与 静态库 II . 编译动态库 III. Android Studio 使用第三方动态库 IV . Android Studio 关键代码 V . 博客资源 I . 动态库 ...

  4. 借助Android Studio生成图标(图片)drawable文件夹下的xml文件

    目录 一.准备图标或者图片 二.AS新建Vector Asset 如标题所示,借助Android Studio生成图标(图片)的xml文件,存放在drawable文件夹下. 一.准备图标或者图片 本人 ...

  5. 利用Android Studio的 Monitor Memory 查找内存泄漏

    App开发总会遇到内存泄漏的情况,在Eclipse时代我们一般使用MAT来配合分析,Android Studio会方便一些,因为它自带了一个Monitor Memory.下面我们来看看怎么使用这个工具 ...

  6. android内存溢出错误,Android Studio 生成 JavaDoc 空指针异常|文档编码出错|内存溢出...

    一般使用Android Studio生成 JavaDoc会有三个问题: 1.空指针异常 Tools --> Generate JavaDoc -->打开对话框活,在"Other ...

  7. [安卓开发笔记二]android Studio通过jni调用C++代码

    [安卓开发笔记二]android Studio通过jni调用C++代码 16/12/11 更新 此博客基于安卓android studio 1.5所写,现在已经有了android studio2.2的 ...

  8. Android开发基础:利用 Android Studio开发看美女应用(4)

    利用 Android Studio开发看美女应用 今天我们会利用 Android Studio开发一个简单的看美女应用,通过它查看互联网上的美女图片.通过本篇文章,你将会学到Android应用简单开发 ...

  9. android studio生产签名文件,Android Studio 生成 keystore 签名文件

    Android Studio 生成 keystore 签名文件 常见 SSL 证书格式 : .DER .CER,文件是二进制格式,只保存证书,不保存私钥. .PEM,一般是文本格式,可保存证书,可保存 ...

最新文章

  1. 世博会、新三国、新红楼
  2. pta l2-7(家庭房产)
  3. 分拣外观残缺的机器人_中国鞋业高峰论坛大咖云集,国辰机器人解读“鞋业智造”...
  4. 第七十五期:网络 | 5G那些运营商不愿说的秘密
  5. 设置ORACLE_HOME环境变量
  6. java验证cron表达式_cron表达式
  7. leetcode59题:滑动窗口的最大值(用双端队列实现)
  8. 若依集成aj-captcha实现滑块验证码(单体版)
  9. 一文带你了解Java反射机制
  10. 一个关于反序列化的小问题
  11. 有没有更好的写v =(v == 0?1:0)的方法; [关闭]
  12. jsp 设置404页面
  13. python之requests模块
  14. Tomcat无法成功启动startup.bat解决方法(闪退)
  15. 如何在微软的下载商店找到下载的图片?
  16. 60级神圣系圣骑心得(转)
  17. python练习-prat1
  18. vue2 mapEchart示例
  19. C++-对于一个频繁使用的短小函数,应该使用什么来实现?有什么优缺点?
  20. 【html+css】

热门文章

  1. 洛谷4400 BlueMary的旅行(分层图+最大流)
  2. learn_Day14 内置函数补充、反射、初识面向对象
  3. Web---JSP-EL表达式
  4. 正则表达式是匹配模式,要么匹配字符,要么匹配位置
  5. input输入框修改placeholder和readonly的样式
  6. JS数组reduce()方法
  7. php curl 批量,PHP实现的curl批量请求操作
  8. python中digits什么意思_在Caffe中使用 DIGITS自定义Python层
  9. Tomcat配置https访问SSL证书(pfx文件)
  10. zkui - Zookeeper的Web UI界面 windows环境