RK3288 JNI实现so库的生成与调用

配置JNI : https://blog.csdn.net/shao15232/article/details/102500277

配置好JNI后我们来新建一个简单的demo,实现so库的生成和调用。

我们先新建一个demo。

打开Android stdio然后新建一个空白demo

RK3288 JNI实现so库的生成与调用_第1张图片

然后设置这个demo的存储路径,注意语言要选择java。不要用推荐的kt。

 

完成后就进入Android stdio的编码界面了。然后右键app,new一个jni的文件夹。

RK3288 JNI实现so库的生成与调用_第2张图片

RK3288 JNI实现so库的生成与调用_第3张图片

直接点Finish。这个时候  这个JNI文件夹就出来了。如下图:

RK3288 JNI实现so库的生成与调用_第4张图片

接下来我们需要在mainActivity中新建一个类,用来衔接Java和C语言。如下图

RK3288 JNI实现so库的生成与调用_第5张图片

在弹出的对话框中声明我们要新建的类名。

RK3288 JNI实现so库的生成与调用_第6张图片

完成后点击OK。

到这里我们才完成一半的工作。

RK3288 JNI实现so库的生成与调用_第7张图片

我们找到我们刚才添加的类。在右边写上下面的代码。

RK3288 JNI实现so库的生成与调用_第8张图片

1 用来加载我们生辰的so库。

2 我们随便写的一个用来测试的函数。

 

这个时候会提示我们GBK不认识。那么我们设置一下UTF-8就好了。

具体做法如下:  -encoding UTF-8  这句话放到下图的地方。这句话一定要紧跟jni目录后面,位置一定不能错。

RK3288 JNI实现so库的生成与调用_第9张图片

注意一定不要点开黄色的两个箭头添加,会出错。

到这里给我们的jniInterface class添加头文件。

如下图:右键jniInterface选择javah

RK3288 JNI实现so库的生成与调用_第10张图片

这个时候打开jni文件夹能看到我们添加的头文件。

RK3288 JNI实现so库的生成与调用_第11张图片

接下来我们找到这个头文件的存储目录,并添加三个文件。如下图:

RK3288 JNI实现so库的生成与调用_第12张图片

在这个文件中添加如图三个文件,名字分别为:Android.mk Application.mk JNI.cpp

然后再这三个文件中添加源码。

Android.mk 源码:

LOCAL_PATH := $(call my-dir)  #获取Android.mk所在目录
 
include $(CLEAR_VARS)
# 下面一句是用来指定so库生成位置的,感兴趣的朋友可以试试,确实可以改变so库生成位置。
# NDK_APP_DST_DIR=../../../../../SharedLibs/$(TARGET_ARCH_ABI)
 
LOCAL_MODULE    := jniTest   #指定生成so库的名称
LOCAL_SRC_FILES := JNI.cpp   #指定生成so库所需源码文件
include $(BUILD_SHARED_LIBRARY)  #说明生成的是动态so库(这句是废话)

 

Application.mk 源码:

# APP_ABI :=armeabi armeabi-v7a mips x86
APP_ABI :=armeabi-v7a   #指定生成的so库适用的cpu架构,这个是最常见的一种。

JNI.cpp 源码:

#include"com_example_myapplication_jniInterface.h"

JNIEXPORT jstring JNICALL Java_com_example_myapplication_jniInterface_tw_1jniTest
  (JNIEnv *env, jobject obj)
{
    return env->NewStringUTF("TERAWINS");
}

 

到这里jni设置差不多就完成了,我们现在需要用ndk-build来编译一下我们刚才设置的jni,生成so库。如下图

右键jni文件夹->NDK->ndk-build

RK3288 JNI实现so库的生成与调用_第13张图片

这个时候可以发现,main目录下面多了libs和obj。

下图红框就是我们生成的so库。

RK3288 JNI实现so库的生成与调用_第14张图片

 

做到这里我们编译一下,发现没有错误。接着往下走。

我们找到layout->activity_main.xml  然后给我们的textView加个句柄。如下图:

RK3288 JNI实现so库的生成与调用_第15张图片

找到mainActivity,添加如下图内容:

RK3288 JNI实现so库的生成与调用_第16张图片

1 找到mainActivity文件

2 导入TextView包

3 先声明一个TextView tv 实例指向空。

4 让tv 指向我们上一步设置的TW句柄。

5 把我们用jni设置的返回字符串在tv指向的TextView中显示出来。

这个时候编译可以过但是app不能正常运行。

因为还有一个地方要设置:

RK3288 JNI实现so库的生成与调用_第17张图片

在build.gradle中加入上图中红框的内容。屏蔽默认的库调用路径,使用我们刚生成的so库的调用路径。

为了设置so库调用路径。

最后设置成功,点击run.

app在我们的RK3288上面跑起来,效果如下图:

你可能感兴趣的:(RK3288,RK3288,Android,stdio,so库,jni)