★ Android基础篇 初步NDK开发 .SO文件生成与JIN调用

★ Android基础篇 初步NDK开发 .SO文件生成与JIN调用

就是生产个so文件,并且可以调用C里面的方法。但为什么要写一篇满论坛多的是的文章呢,就是因为我踩了N多个坑,希望可以帮助大家,让大家少走弯路。

先看一下效果图
这里写图片描述

【1环境的搭建】

NDK没有的可以去下载 :https://developer.android.com/ndk/downloads/index.html
这里写图片描述
添加完NDK 记得看一下这里
这里写图片描述
接着看这里
这里写图片描述
要加上这句代码:android.useDeprecatedNdk=true 很重要!很重要!

【2 java类编写的代码】

public class JniTest {
    static {
        System.loadLibrary("jary");
    }
    public native String getString();
}

然后接着
这里写图片描述

之后你会发现生成了一个JniTest .class文件
这里写图片描述

【3 Terminal 命令】
cd 到mian 文件下 然后 输入命令:javah -d jni -classpath 自己编译后的 class 文件的绝对路径
这里写图片描述

debug 后面是空格!debug 后面是空格!debug 后面是空格!

之后就会生成一个.h的文件
创建一个.c的文件,include后面的是生成.h文件的名字
里面的(JNIEXPORT jstring JNICALL Java_com_example_lxndk_JniTest_getString)
是.h文件中方法(重写一下)

#include"com_example_lxndk_JniTest.h"
JNIEXPORT jstring JNICALL Java_com_example_lxndk_JniTest_getString
    (JNIEnv *env, jobject jobject1){
    return (*env)->NewStringUTF(env,"Hello Jin =_=!");
    }

然后–在 build.gradle defaultConfig 中添加如下代码

  ndk {
            moduleName "jary" //生成的so名字
            abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。

        }

到这里的jni 调 C 就完成了,但是我想说的是!为什么会报这个错???
这里写图片描述

然后我发现我貌似缺少了东西,Android.mk…
创建Android.mk文件

# 构建系统提供的宏函数 my-dir 将返回当前目录(包含 Android.mk 文件本身的目录)的路径,基本上是固定的,不需要去动
LOCAL_PATH := $(call my-dir)

# 会清除很多 LOCAL_XXX 变量,不会清除 LOCAL_PATH,基本上是固定的,不需要去动
include $(CLEAR_VARS)

# 需要构建模块的名称,会自动生成相应的 libNDKSample.so 文件,每个模块名称必须唯一,且不含任何空格
LOCAL_MODULE := jary

# 包含要构建到模块中的 C 或 C++ 源文件列表
LOCAL_SRC_FILES := jary.c

# 指定这个模块里会用到哪些原生 API,详见:https://developer.android.google.cn/ndk/guides/stable_apis.html
LOCAL_LDLIBS := -llog

# 帮助系统将所有内容连接到一起,固定的,不需要去动
include $(BUILD_SHARED_LIBRARY)

这里写图片描述
要改成自己对应的.c 还有构建模块的名称

Application.mk

# 选择不同的 ABI,多个使用空格作为分隔符,全部是all
# APP_ABI := armeabi armeabi-v7a
APP_ABI := all

# 指定要使用的运行时
APP_STL := gnustl_static

这里写图片描述

最后在 build.gradle android 下 指定目录!
这里写图片描述

运行效果
这里写图片描述

【4生成so文件】
这里写图片描述

到这里才基本结束!

源码地址:https://download.csdn.net/download/macaopark/10340231

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2854.html原文链接:https://javaforall.net

(1)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • bootstrap 合并单元格之mergeCells属性合并

    bootstrap 合并单元格之mergeCells属性合并bootstrap合并单元格之mergeCells属性合并合并单元格有多种实现方式本文是根据bootstrap自带的mergeCells属性实现的单元格合并,原理是根据有规律的排序数据然后在展示层根据数据行数合并,这样的劣势是数据一定要有规律事先要排序还有一种是比较灵活的是事先处理好数据合并成一行,然后自己去展示层设计怎么展示,而且不用考虑分页问题,详情在我的…

    2022年4月19日
    218
  • 5线上模式刷2亿bug_GTA5还想冲销量?玩家利用BUG刷钱,遭受比封号更严厉惩罚

    5线上模式刷2亿bug_GTA5还想冲销量?玩家利用BUG刷钱,遭受比封号更严厉惩罚  《GTA5》作为一款神级开放世界游戏,即便已经发售了七年,凭借其优秀的品质以及耐玩性,而今仍旧是许多玩家讨论的焦点。不过在近期,鲜有出现负面消息的R星却因为线上模式的BUG而受到了玩家们的非议。  《GTA5》说是游戏,但你在玩的过程中不自觉就代入到了主角的视角中。跟现实世界一样,美金在游戏中也非常重要。有了钱,你就可以在洛圣都这个虚拟世界中过自己想要的生活。  但玩家在游戏中无论是使用合法的…

    2022年4月26日
    344
  • 反演定理及其应用_反演定理的证明

    反演定理及其应用_反演定理的证明一、莫比乌斯反演莫比乌斯反演公式:若F(n)=∑i|nf(i)F(n)=∑i|nf(i)F(n)=\sum_{i|n}f(i)则f(n)=∑i|nμ(i)F(ni)f(n)=∑i|nμ(i)F(ni)f(n)=\sum_{i|n}\mu(i)F(\frac{n}{i})为什么呢?请看证明:由于莫比乌斯函数具有性质∑i|nμ(i)=[n=1]∑i|nμ(i)=[n=1]\…

    2022年10月22日
    0
  • 一步一步安装及配置R及Rstudio(详细图文)

    一步一步安装及配置R及Rstudio(详细图文)文章目录一、R下载及安装1.下载2.安装二、Rstudio下载及安装1.下载2.安装3.配置一、R下载及安装1.下载https://cran.r-project.org/mirrors.html选择清华的TUNA镜像根据需要选择下载,以windows下载为例选择base点击下载2.安装确定Next选安装目录时候,需要注意没必要安…

    2022年6月27日
    27
  • UML教程_css餐厅游戏答案

    UML教程_css餐厅游戏答案 UML教程

    2022年10月24日
    0
  • ubuntu eclipse 乱码「建议收藏」

    ubuntu eclipse 乱码「建议收藏」今天,把windows下的工程导入到了Linux下eclipse中,由于以前的工程代码,都是GBK编码的(Windows下的Eclipse默认会去读取系统的编码,所以Widnwos下的Eclipse的编码为GBK),而Ubuntu默认是不支持GBK编码的。所以,首先我们要先让Ubuntu支持GBK,方法如下:修改/var/lib/locales/supported.d/local文

    2022年5月25日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号