NDK静态注册之调用C层并返回字符串

NDK静态注册之调用C层并返回字符串

1. 前言

Hello,大家好,我是码农星期八,事情是这样婶的,最近在测试安卓Java层通过NDK调用so©层,中间发生了一些莫名其妙的一些问题,以此来记录一下。

2. 创建Android项目

本项目通过AndroidStudio创建。

创建项目过程不做过多介绍,不是本文重点。

保证能通过编译,并且能运行起来就好。
在这里插入图片描述

就简简单单一个项目就行。

3. 使用native修饰一个方法

代码

//获取C层返回的字符串
public native CharSequence GetSoBackString();

如图

在这里插入图片描述

这会提示错误,但是不用管,编译的时候不会报错。

JNI介绍

1.定义:
	JAVA Native Interface
	JNI是一种协议
2.作用:
	通过JNI能使java和c++相互调用

抄的,没啥用,反正就是通过JNI来实现Java和C交流的。

4. 静态注册

4.1 cd到<项目>\app\src\main\java

这个箭头好像反了,但是不重要,反正就是cd到这个项目的java目录下。

在这里插入图片描述

4.2 执行命令

命令

javah -jni -encoding UTF-8  com.example.ti.testndk.MainActivity

如图

跟我一样表示正确。

javah最后后面的参数就是包名类名

在这里插入图片描述

4.3 在<项目>/app下创建jni文件夹

在这里插入图片描述

4.4 复制上述命令生成的.h文件

这里移动写错了,改成复制

在这里插入图片描述

4.5 再在jni文件夹下创建一个.c文件,内容如下

JNIstudy.c

#include <JNIstudy.h>
JNIEXPORT jobject JNICALL Java_com_example_ti_testndk_MainActivity_GetSoBackString
  (JNIEnv *env, jobject obj){
  //类型转换 NewStringUTF(env,字符串)
  	 jstring str = (*env)->NewStringUTF(env, "hello test NDK");
    return str;
  }

JNIstudy.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_ti_testndk_MainActivity */

#ifndef _Included_com_example_ti_testndk_MainActivity
#define _Included_com_example_ti_testndk_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_ti_testndk_MainActivity
 * Method:    GetSoBackString
 * Signature: ()Ljava/lang/CharSequence;
 */
JNIEXPORT jobject JNICALL Java_com_example_ti_testndk_MainActivity_GetSoBackString
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

如图

在这里插入图片描述

4.6 再在jni文件下创建Android.mk和Application.mk文件

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := JNIstudy #模块名
LOCAL_SRC_FILES := JNIstudy.c #源文件.c或.cpp
LOCAL_ARM_MODE  := arm #编译后的指令集ARM指令
LOCAL_LDLIBS    := -llog #依赖库
include $(BUILD_SHARED_LIBRARY) #指定编译文件的类型

Application.mk

APP_ABI := armeabi-v7a

如图

在这里插入图片描述

4.7 ndk编译

先cd到jni文件夹下。

在这里插入图片描述

编译成功过后,编译好的东西会在libs下。

在这里插入图片描述

5. 配置libs

在app下的build.gradle的android下添加以下代码。

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

在这里插入图片描述

6. 在MainActivity中加载libs资源

代码

static {
        System.loadLibrary("JNIstudy");
    }

如图

在这里插入图片描述

运行到模拟器中

到此,基本上应该是可以的了,运行即可。

在这里插入图片描述

这不,Toast拿到的是C层返回的字符串。

总结

本文重点并不是说让你学会多nb的东西,而是NDK静态注册入门。

毕竟很多时候被劝退并不是代码太难,而是莫名其妙的问题。

越努力,越幸运。

如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。

我是码农星期八,如果觉得还不错,记得动手点赞一下哈。

感谢你的观看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值