博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NDK静态注册之调用C层并返回字符串
阅读量:4219 次
发布时间:2019-05-26

本文共 2246 字,大约阅读时间需要 7 分钟。

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 
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 
/* Header for class com_example_ti_testndk_MainActivity */#ifndef _Included_com_example_ti_testndk_MainActivity#define _Included_com_example_ti_testndk_MainActivity#ifdef __cplusplusextern "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或.cppLOCAL_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静态注册入门。

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

越努力,越幸运。

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

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

感谢你的观看。

转载地址:http://uqvmi.baihongyu.com/

你可能感兴趣的文章
内核态与用户态
查看>>
趣链 BitXHub跨链平台 (4)跨链网关“初介绍”
查看>>
C++ 字符串string操作
查看>>
MySQL必知必会 -- 了解SQL和MySQL
查看>>
MySQL必知必会 -- 数据检索
查看>>
MySQL必知必会 -- 排序检索数据 ORDER BY
查看>>
POJ 3087 解题报告
查看>>
POJ 2536 解题报告
查看>>
POJ 1154 解题报告
查看>>
POJ 1661 解题报告
查看>>
POJ 1101 解题报告
查看>>
ACM POJ catalogues[转载]
查看>>
常见的排序算法
查看>>
hdu 3460 Ancient Printer(trie tree)
查看>>
KMP
查看>>
poj 3863Business Center
查看>>
Android编译系统简要介绍和学习计划
查看>>
Android编译系统环境初始化过程分析
查看>>
user2eng 笔记
查看>>
DRM in Android
查看>>