android 浅尝JNI 打包so库

本文详细介绍了一个完整的JNI实践过程,包括配置Android Studio环境、编译生成H文件、创建C代码及打包SO库等步骤,并提供了丰富的截图辅助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接触安卓有一段时间了,一直没有时间或者说自己没有主动去练习一些jni,今天就来分享一下jni的过程、步骤
我用的环境是studio jdk1.8
1:下载ndk 地址自行百度 安装完成后配置环境变量
这里写图片描述这里写图片描述
2:AS新建一个项目,然后打开设置 配置一下ndk路径
这里写图片描述
然后配置一下gradle文件 如图
这里写图片描述
3: 这时候开始编写代码了,如下图
这里写图片描述
不擅长文字描述,多用图片,大家别介意,重点来了:
4: 命令行进入刚才编写的NativeTest文件路径 javac 类名.java生成javac文件 如图:
这里写图片描述
然后开始编译生成.h头文件 javah 包名.类名看下图 注意命令行目录位置:这里写图片描述
5:有了头文件 接下来要创建jni目录 编写c代码了 步骤 如图:

这里写图片描述 直接点finish就好 然后复制刚才的.h头文件到这个目录里面 如图:
这里写图片描述
这时候创建一个.c文件 开始编写c代码了 如图:
这里写图片描述
这里写图片描述
好了 开始编写c代码 在刚刚创建的.c文件编写 先引入.h头文件:

#include <com_ndktest_NativeTest.h>`

下一步 重写.h头文件的方法:

//
// Created by Administrator on 2017/9/14 0014.
//
#include <com_ndktest_NativeTest.h>
JNIEXPORT jstring JNICALL Java_com_ndktest_NativeTest_getHint
        (JNIEnv *env, jclass obj){
    return (*env)->NewStringUTF(env,"简单的方法返回值 ,不传参数");
}


JNIEXPORT jstring JNICALL Java_com_ndktest_NativeTest_getToastInfo
        (JNIEnv *env, jclass o, jstring s){
    return  s;
}

配置一下等下要生成的so名字 架构:

这里写图片描述
接下来 在刚才的cpp目录 创建 Android.mk文件 用于编写so的一些配置:
这里写图片描述
还有一个Application.mk文件:
这里写图片描述重点来了;开始打包so库
7: 命令如下图:
这里写图片描述

大功完成99,还差最后一点点 注释掉刚才build里的这几句话 删除也可以:

 ndk {
            moduleName "test"//指定生成的so文件名
            abiFilters "armeabi", "armeabi-v7a", "x86"//cpu的类型
        }

        sourceSets.main {
            jni.srcDirs = ['libs']
        }

然后在项目的main目录新建一个jniLibs目录 拷贝libs里的全部架构进去,删除libs obj jni目录文件 当然,你喜欢 也可以复制到其他地方保存
这里写图片描述
最后一步了 我们回到一开始编写的NativeTest.java类里面 初始化一下我们打包的so库:

package com.ndktest;


public class NativeTest {
    static {
        System.loadLibrary("test");
    }

    public static native String getHint();

    public static native String getToastInfo(String values);
}

然后可以去调用这个类的方法了 :

package com.ndktest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.util.Xml;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toast.makeText(this,
                "jni返回的提示:" + NativeTest.getHint() + " 传过去的参数: "
                        + NativeTest.getToastInfo("sdadasda"),
                Toast.LENGTH_SHORT).show();
        Log.e("jni返回的提示",NativeTest.getHint());
        Log.e("传过去的参数",NativeTest.getToastInfo("sdadasda"));
    }
}

这里写图片描述这里写图片描述
好了,本文到这里结束了,希望大家喜欢;
ps:在.c里面返回字符串的时候 使用这个NewStringUTF 请注意,如果你在java里传过去的是字符串 ,请别用NewStringUTF 进行编码 会报错,解决方法两个 1:不使用NewStringUTF ,原样返回值,2 :对传过来的java字符串进行转码,比较麻烦,自行百度。如有疑问请邮件留言 1668126018@qq.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值