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文件的更多相关文章

  1. Android studio 下JNI编程实例并生成so库

    Android studio 下JNI编程实例并生成so库 因为公司需要为Android相机做美颜等图像后期处理,需要使用JNI编程,最近学了下JNI,并且在Android Studio下实现了一个小 ...

  2. Android Studio使用JNI

    0x01 前言 本文讲述使用Android Studio通过静态注册.动态注册使用JNI的方法,以及加载第三方so文件的方法 0x02 Android Studio静态注册的方式使用JNI 1. 添加 ...

  3. 利用Android Studio编写 Android上的c与c++程序

    利用Android Studio编写 Android上的c与c++程序 (2017-05-22 19:01:20) 转载▼ 标签: android 分类: Android开发 原文链接: http:/ ...

  4. 利用Android Studio、MAT对Android进行内存泄漏检测

    利用Android Studio.MAT对Android进行内存泄漏检测 Android开发中难免会遇到各种内存泄漏,如果不及时发现处理,会导致出现内存越用越大,可能会因为内存泄漏导致出现各种奇怪的c ...

  5. Android Studio 生成 keystore 签名文件

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

  6. Android Studio生成javadoc出错的解决办法

    一般使用Android Studio生成javadoc会有两个问题: 空指针异常 文档乱码 解决办法如下: 第1个问题:Tools --> Generate JavaDoc -->打开对话 ...

  7. Android Studio新建Jni工程

    2.2版本的Android Studio支持新建Jni工程,不用再像以前自己构建工程目录,首先把自己的升级自己的AS到2.2以上 然后打开Tools->Andorid->SDK manag ...

  8. Android studio 配置JNI环境

    Android studio配置jni开发环境,主要配置是两个build文件,以及新建一个jni文件,放c代码. 代码如下1: apply plugin: 'com.android.model.app ...

  9. Android Studio生成keystore签名文件步骤讲解

    Android App打包时要用到签名文件,Android Studio生成签名文件步骤如下: Build---Generate Signed Apk...如图: 如果你的project中有2个或者2 ...

随机推荐

  1. 【问题解决方案】AttributeError: module 'pygal' has no attribute 'Worldmap'

    <Python编程:从入门到实践>- 16章-16.2.5制作世界地图 import pygal 后报如标题的error 参考CSDN 解决:AttributeError: module ...

  2. 动态chart Demo

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  3. poj-3177(无向图缩点)

    题意:给你n个点,m条边的无向联通图,问你最少增加几条边,使得这个图每对点至少有两条路径 解题思路:考虑每个环内的点必定有>=2条路径,所以先把这个无向图中的环去掉,用并查集缩环,然后剩下的图一 ...

  4. NABCD--团队项目1

    N: 1.学校中有很多学生是外省的,然后不知道附近有什么地方周末可以去玩. 2.学校中学生有很多用不到的东西但是联系不到合适的买家. A: 我们可以做一个软件,通过学号注册登陆软件,这样可以防止有人去 ...

  5. $.ajax居然触发popstate事件?

    我使用$.ajax用来实现一个搜索效果 近段时间因为苹果上微信浏览器的不知明原因需要处理返回事件,因此加多了popstate事件监听用来分别处理苹果跟安卓的返回. 可是居然影响到了我前面的ajax搜索 ...

  6. BackGround

  7. Linux-Jenkins安装部署

    Jenkins 安装及插件安装 Jenkins简介: Jenkins只是一个平台,真正运作的都是插件.这就是jenkins流行的原因,因为jenkins什么插件都有 Hudson是Jenkins的前身 ...

  8. Number和toString中的坑

    在之前的一篇文章 JavaScript中的大数相加 中,在做大数相加时, 突然想到 数字.toString方法 会报错,但是作为函数参数传进来,直接调用 toString 方法却不会报错 上网搜了看看 ...

  9. 分布式版本控制系统 Git 的安装与使用

    作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 远端库地址:https://github.com/CJL29 ...

  10. python的数据类型及运用

    int: 主要方法:a.bit.length()———将a转化为二进制的最小位数: bool: false/True str——>bool: s='空'——>false s=“非空”——& ...