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
												

最新文章

  1. Windows10应用Docker部署DoNet Core
  2. iOS NSDate等时间类的使用
  3. mysql查询一个小知识点,查询结果是空与查询出错是不一样的
  4. 学C日志
  5. 窗口 - dialog - 与后端交互
  6. javascript中求浏览器窗口可视区域兼容性写法
  7. CSS理解之padding--非原创
  8. C++网络爬虫抓取图片
  9. KMP poj
  10. js获取上传文件的绝对路径
  11. metasploit nessus &amp; db_autopwn
  12. Vue与swiper想结合封装全屏轮播插件
  13. Android弹出Toast工具类总结
  14. 实战ELK(1) 安装ElasticSearch
  15. PAT 2016 数据的交换输出
  16. 原生js:click和onclick本质的区别
  17. 翻新并行程序设计的认知整理版(state of the art parallel)
  18. BZOJ3996 TJOI2015线性代数
  19. UML Diagrams Using Graphviz Dot
  20. 【opencv入门篇】 10个程序快速上手opencv【上】

热门文章

  1. Django Models 查询操作
  2. java学习——JDK1.8接口和实现类
  3. [官网]Windows modules
  4. AI佳作解读系列(四)——数据增强篇
  5. table 里输入rules 验证
  6. Power BI For Competition
  7. 洛谷P5119 Convent 题解
  8. 「CF#554 div2」题解
  9. Eureka 配置
  10. jacoco+maven 初次使用覆盖率工具