环境搭建
1. android studio2021.2.1
2. JDK版本1.8
一、创建一个android项目
File ——> New ——> New Project ——> Empty Activity
创建后如下图所示
二、创建一个java调用C的类
2.1 java类命名为JNITest,创建一个两数之和的方法sums
大概需求:①java传两个整数给C
②C接收到来自java的两个整数,并且相加
③C把两个数之和的结果返回给java
2.2 根据java类生成jni.h的头文件
(1)AS打开Terminal窗口
点击底部导航栏Terminal
(2) 用命令打开JNITest类所在的目录
在Terminal窗口中输入cd app\src\main\java\com\zaq\javacallc,按键盘Enter键
(3)执行命令 javac -encoding utf8 -h . JNITest.java(注意:-encoding utf8 指定源文件编码格式,-h后面有个点,点 前后面都有个空格,点的意思是头文件生成在当前目录下)
执行后过会会自动生成一个jni头文件com_zaq_javacallc_JNITest.h,如下图所示:
三、java调用C的过程
3.1 创建/配置相应的文件
(1)在main下创建一个jni文件夹
(2) 把头文件移到jni文件夹下,删除JNITest.class
(3)在jni下创建C/C++ Source File,命名为Test.c。
(4)在jni下创建文件Android.mk
Android.mk里面的内容
#表示Android.mk所在目录LOCAL_PATH := $(call my-dir)#CLEAR_VARS变量指向特殊 GNU Makefile,用于清除部分LOCAL_变量include $(CLEAR_VARS)#模块名称LOCAL_MODULE:= javacallc#构建系统用于生成模块的源文件列表LOCAL_SRC_FILES := Test.c#BUILD_SHARED_LIBRARY 表示.so动态库#BUILD_STATIC_LIBRARY 表示.a静态库include $(BUILD_SHARED_LIBRARY)
3.2 在gradle.build中的配置,生成so库文件
(1)gradle.build配置
android里面的defaultConfig配置
//定义ndkBuild默认配置属性 externalNativeBuild { ndkBuild { cppFlags "" } } ndk { // 生成指定CPU平台对应的so库文件 abiFilters "arm64-v8a" }
跟defaultConfig同级的配置
//定义ndkBuild对应的Android.mk路径(重要)externalNativeBuild {ndkBuild{path file("src/main/jni/Android.mk")}}
(2)查看最终so库文件的生成
重新Rebuild Project,即点击状态栏的 File ——> Rebuild Project
so文件的最终命名是lib+javacallc(Android,mk文件里面的模块名称).so,即:libjavacallc.so
最终生成so库文件的路径如下:
3.3 在C代码实现两数相加
(1)在Test.c编写相加代码
把com_zaq_javacallc_JNITest.h文件导入进来,再把相加方法拷贝进来进行参数的相加
(2) MainActivity调用sums()方法
运行后最终的输出结果如下图所示: