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静态注册入门。
毕竟很多时候被劝退并不是代码太难,而是莫名其妙的问题。
越努力,越幸运。
如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。
我是码农星期八,如果觉得还不错,记得动手点赞一下哈。
感谢你的观看。