Android Studio 下so文件的生成及利用jni调用(一)

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();
}

如下图
图5

生成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());

final success

Demo的github链接:https://github.com/ly27253/ly-Android-Studio-so-jni-demo

END !

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值