Android Studio 下利用c语言生成so文件并利用jni调用
**前言:**由于自己也是小白学习,网上这类教程比较杂乱无序,不太系统,踩了太多抗,由于最近忙于事情,仅记录下自己在Android Studio下生产so文件并成功调用的例子,过程多以图片显示,没时间码字,不足之处多见谅。
准备工作:
1、Android Studio 下载安装;
2、SDK、NDK、JRE安装与环境变量设置;
这是前期需要做的基本工作;以上教程很多,可自己寻优选择教程学习。
平台环境与工具版本:
1、ubuntu18.04LTS
2、Android Studio Arctic For | 2020.3.1
一、生成so
生成新工程:
定义工程名:
加NDK路径:
首先找到你“ndk-build"文件,右键属性,复制路径加在local.properties,如下图
新建java文件:
在图示目录下new->java class 并取名(留意此名,与后续一致)
加入代码:
package com.example.testjni3;
public class Jni3Test {
static {
System.loadLibrary("Jni3Test");
}
public static native String getJniTestString();
}
如下图
生成class文件
打开Terminal,cd到新建Jni3Test目录下并生产class文件
cd app/src/main/java/com/example/testjni3
javac Jni3Test.java
如下图示
生成class对应的头文件.h
cd到main下,执行,这里不得不说很抗——之前Android版本用的是javah ****,现在javah 被javac “吃了”。如下代码片及图示。
javac -h jni java/com/example/testjni3/Jni3Test.java
jni文件夹下新建c文件
c文件中加入方法的实现代码
#include "jni.h"
#include "com_example_testjni3_Jni3Test.h"
JNIEXPORT jstring JNICALL Java_com_example_testjni3_Jni3Test_getJniTestString
(JNIEnv *env, jclass jz)
{
return (*env)->NewStringUTF(env,"ly miss family and study Android jni");
}
新建Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Jni3Test
LOCAL_SRC_FILES := test.c
include $(BUILD_SHARED_LIBRARY)
新建Application.mk
APP_PLATFORM := android-16
APP_MODULES := Jni3Test
APP_ABI := all
执行ndk-build生成so
注意:先cd到jni目录下如图Terminal显示
ndk-build
二、第三方利用jni调用生成的so新建proj如图
定义工程名
接下来将全部so加入到新建工程的libs下,结构目录如下图;并在app下的build.gradle下加入如下代码
sourceSets {
main{
jniLibs.srcDirs=['libs']
}
注意加的位置如图
将生成so时所用到的java层声明布局进来
具体:cd到example目录下执行mkdir testjni3
生成同层文件夹。
在新建与前述同名java class 如图
添加代码
package com.example.testjni;
public class JNITest {
static {
System.loadLibrary("JNITest");
}
public static native String getJniTestString();
}
注意:如下图报错,根据提示直接点击自动在native-lib中帮助我们生成对应的本地声明,native-lib可理解为桥梁链接作用吧?
在MainActivity中对应位置加入如下代码,查看是否调用成功,如图已经成功
import com.example.testjni.JNITest;
tv.setText(JNITest.getJniTestString());