Android 开发 DNK开发将.c文件打包成os
前言
不废话太多,Java与C之间联系的JNI的概念,这个要了解可以参考下面这个博客:
https://www.jianshu.com/p/87ce6f565d37
此博客只说明如何将.C文件通过NDK打包成so库并且使用的一个简单demo.
第一步 创建用于引用本地os库的Java工具类
目录
工具类代码
package zq.ndkdemo; public class NDKTools { static {
System.loadLibrary("ndkdemomk-jni");//这里的"ndkdemomk-jni"是下面.mk文件里局部模块的值,这个到后面我会解释
} public static native String getNDKcontent();//您在Java里调用so库的静态方法
}
第二步 将Java工具类打包成.h文件
打开Android studio的Terminal准备用javah打包.h文件, cd进入到app/src/目录下 然后输入 javah -o ndkdemoHFile.h -jni -classpath ./main/java/ zq.ndkdemo.NDKTools 命令.(下面会解释这条命令)
解释一下这行命令
javah -o ndkdemoHFile.h -jni -classpath ./main/java/ zq.ndkdemo.NDKTools
javah -o 你要打包的.h文件名加后缀 -jni -classpath 中间的路径 app包名+工具类名
输入这条命令后,如果没报错,你就会在src目录下获得您的.h文件,如下图:
打开.h可以看到:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class zq_ndkdemo_NDKTools */ #ifndef _Included_zq_ndkdemo_NDKTools
#define _Included_zq_ndkdemo_NDKTools
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: zq_ndkdemo_NDKTools
* Method: getNDKcontent
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_zq_ndkdemo_NDKTools_getNDKcontent
(JNIEnv *, jclass); #ifdef __cplusplus
}
#endif
#endif
第三步 创建jni文件夹并且将.h文件移入
在main目录下创建一个jni文件夹
将我们打包好的.h文件移动到jni文件夹里
第四步 创建c语言函数文件
进入到jni文件夹里,点击创建任意名称加.c后缀的文件
打开写入代码如下:
#include "ndkdemoHFile.h" JNIEXPORT jstring JNICALL Java_zq_ndkdemo_NDKTools_getNDKcontent
(JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env,"Hellow World,这是NDK的第一行代码");
}
注意!代码里最好别写注释特别是中文注释.
#include "ndkdemoHFile.h"
这行代码引用的就是.h文件名称
JNIEXPORT jstring JNICALL Java_zq_ndkdemo_NDKTools_getNDKcontent
这行代码中 jstring 为返回值
Java_zq_ndkdemo_NDKTools_getNDKcontent 为 Java + 路径 + 类名 + 方法名称
第五步 创建.mk文件
在jni目录下创建一个叫Android.mk的文件
内容如下:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := ndkdemomk-jni LOCAL_SRC_FILES := ndkdemoCFile.c include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)
:
每个Android.mk文件必须以定义开始。它用于在开发tree中查找源文件。宏my-dir
则由Build System 提供。返回包含Android.mk目录路径。
include $(CLEAR_VARS)
:
CLEAR_VARS
变量由Build System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_xxx。例如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES等等。但不是清理LOCAL_PATH。这个清理是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能便面相互影响。LOCAL_MODULE := ndkdemomk-jni
:
OCAL_SRC_FILES := ndkdemCFile.c
:
include $(BUILD_SHARED_LIBRARY)
:
BUILD_SHARED_LIBRARY
是Build System提供的一个变量,指向一个GUN Makefile Script。它负责收集自从上次调用include $(CLEAR_VARS)
后的所有LOCAL_xxxxinx。并决定编译什么类型
BUILD_STATIC_LIBRARY
:编译为静态库BUILD_SHARED_LIBRARY
:编译为动态库BUILD_EXECUTABLE
:编译为Native C 可执行程序BUILD_PREBUILT
:该模块已经预先编译
第六步 在build.gradle文件里添加部分代码
android {
compileSdkVersion 28
defaultConfig {
applicationId "zq.ndkdemo"
minSdkVersion 27
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" //需要添加的部分
ndk{
moduleName "ndkdemo-jni"
abiFilters "armeabi-v7a", "x86"
} }
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
//需要添加的部分
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk'
}
}
//需要添加的部分
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
//需要添加的部分
sourceSets{
main {
jni.srcDirs = []
}
} }
第七步 检查Android studio是否已经下载配置过ndk
点击local.properties打开
ndk.dir=/media/E/tools/SDK/androidsdklinux/ndk-bundle
sdk.dir=/media/E/tools/SDK/androidsdklinux
如果没有就需要进入到File >> Settings 里下载ndk

第八步 编译SO文件
在Android studio的工具栏里,点击Build >> clean Project 先清理一下之前的编译
在点击Build >> Rebuild Project 重新创建编译文件
然后可以打开下图所示路径,就可以看到我们的so文件了
第九步 调用工具类方法,run APP
public class MainActivity extends AppCompatActivity {
private TextView mDemoText; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDemoText = findViewById(R.id.demo_text);
String content = NDKTools.getNDKcontent();
mDemoText.setText(content);
}
}
运行APP 即可.
Android 开发 DNK开发将.c文件打包成os的更多相关文章
- windows下如何将Python文件打包成.exe可执行文件
在使用Python做开发的时候,时不时会给自己编写了一些小工具辅助自己的工作,但是由于开发依赖环境问题,多数只能在自己电脑上运行,拿到其它电脑后就没法运行了.这显得很不方便,不符合我们的初衷,那么有没 ...
- PyQt(Python+Qt)学习随笔:windows下使用pyinstaller将PyQt文件打包成exe可执行文件
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 在<windows下使用pyinstaller将多个目录的Pyt ...
- windows下使用pyinstaller将多个目录的Python文件打包成exe可执行文件
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.引言 需要将一个工程涉及两个目录的模块文件打包成exe,打包环境如 ...
- 把java文件打包成.jar (jar命令详解)
把java文件打包成.jar (jar命令详解) 先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1. ...
- 如何将class文件打包成jar 这里提供两种方式!
原地址:http://blog.163.com/09zzy@126/blog/static/711976652011101001530/ 如何将class文件打包成jar文件,这是一个很严肃的问题,当 ...
- 使用Eclipse把java文件打包成jar 含有第三方jar库的jar包
使用Eclipse把java文件打包成jar 含有第三方jar库的jar包 网上打包说用eclipse安装fat jar插件,但是貌似现在都不能用了,所以我只能按照eclipse自带的方法打包了. ...
- python的py文件打包成exe
一.首先需要安装Pyinstaller-- 使用pip来安装模块 (我电脑上装的是python的一个编译环境Anaconda,如果电脑上装的是python自带的IDE的话,就直接进入python的安装 ...
- Ubuntu下将现有的文件打包成deb包
转自:http://www.linuxidc.com/Linux/2008-04/12297.htm deb是Debian Linux的软件包格式.一般来说是需要通过编译源码然后制作deb包,今天由于 ...
- 如何把py文件打包成exe可执行文件
如何把py文件打包成exe可执行文件 1.安装 pip install pyinstaller 或者 pip install -i https://pypi.douban.com/simple pyi ...
随机推荐
- canvas基础用法
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Java 基础 - instanceof关键字
instanceof 父类子类 结论: 子类 instanceof 父类 == true 父类 instanceof 子类 == false public class Test { public st ...
- Windows shutdown
用法: shutdown [/i | /l | /s | /sg | /r | /g | /a | /p | /h | /e | /o] [/hybrid] [/soft] [/fw] [/f] ...
- jquery学习笔记(四):动画
内容来自[汇智网]jquery学习课程 4.1 显示和隐藏 在jQuery中使用 hide() 和 show() 方法来隐藏和显示 HTML 元素: hide()的语法形式:$(selector).h ...
- 普通的maven项目变成web项目
command+: 或者 这个修改同样可以解决idea中不能新建servlet的问题. 这里最后的目录结构是这样的,如果在上面的设置中尝试修改目录,会导致无法创建servlet,比如我希望将根目录改成 ...
- PAT甲级——A1117 Eddington Number【25】
British astronomer Eddington liked to ride a bike. It is said that in order to show off his skill, h ...
- Linux 实用指令(7)--Linux 磁盘分区、挂载
目录 Linux 磁盘分区.挂载 1 分区基础知识 1.1 分区的方式: 1.2 windows 下的磁盘分区 2 Linux分区 2.1 原理分析 2.2 磁盘说明 2.3 使用lsblk指令查看当 ...
- idea-----Idea在不关闭project的情况下进行Import Project
Idea在不关闭project的情况下进行Import Project 引用:https://blog.csdn.net/qq_28198181/article/details/83069667
- Django 补充知识
目录 Django基于配置文件的编程思想 初步实现 大佬实现 跨站请求伪造csrf 什么是csrf? 前端如何解决 ajax解决 csrf相关的装饰器 FBV方式装饰器 CVB方式装饰器 Django ...
- 传递闭包+求概率——列项相消法lightoj1321好题
主要是要想到边与边的通过概率是独立的,所以先求出最终的概率,然后用推出的公式求总期望即可 最终概率E[0][n-1],可以用传递闭包来做 裂项相消法都不会了.. /* 闭包上推期望 每条边都具有独立性 ...