JNI小记1 -- VS生成so给AS调用

这篇具有很好参考价值的文章主要介绍了JNI小记1 -- VS生成so给AS调用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

万年不变的环境配置

NDK 下载 | Android NDK | Android Developers (google.cn)
需要提的是,直到本文撰写的时间,我在这个页面下的NDK是只有x86-64平台的。而我测试时确实只有x64编译成功。
在visual studio里新建一个安卓共享库工程:
JNI小记1 -- VS生成so给AS调用

刚开始的界面应该是这样的:
JNI小记1 -- VS生成so给AS调用

而后在: 工具->选项->跨平台 选上我们的ndk目录(这里和交叉编译工具链一样,把此前的ndk压缩包解压到你期望的目录):
JNI小记1 -- VS生成so给AS调用

JNI小记1 -- VS生成so给AS调用

再选择项目的重定解决方案:
JNI小记1 -- VS生成so给AS调用

重定好后可以再项目配置(项目->属性)里修改如下(这里clang最好改成5.0):
JNI小记1 -- VS生成so给AS调用

接下来配置include和lib目录。
快速定位这两个目录可以这样,在ndk目录搜索"log.h"(这个也是项目默认所需要引用的)
JNI小记1 -- VS生成so给AS调用

我们要用的是toolchains->llvm的。跳转过去找lib和include文件夹即可
接着将对应目录填进来(包含和引用),添加正确只后可以看到:
JNI小记1 -- VS生成so给AS调用
JNI小记1 -- VS生成so给AS调用

JNI小记1 -- VS生成so给AS调用

环境配置基本完成。

在VS-Android-So默认模板的基础上写JNI

工程一开始如下:
JNI小记1 -- VS生成so给AS调用

需要注意的是,我们的项目在默认情况下是编译不过的。因为定义LOGI、LOGW处的关键字"ANDROID_LOG_INFO"是NDK的头文件"log.h"里才被定义的内容,这里还没被引用。
开头引用:#include<android/log.h>
如果之前的配置步骤一致,编译正常是通过的。
而之后我们再添加JNI调用函数如下:

Java_com_example_myapplication_MainActivity_HelloWorld(JNIEnv * env, jclass jcls) {
		LOGI("init", "012");
		return env->NewStringUTF("Hello World!");
	}

这里用我目前浅薄的认识稍微解释一下,JNI调用函数是很有讲究的。C层的函数接口,其命名需要和安卓工程的名匹配。(当然也有不一致的写法,但我还没学到)最后一截是函数名,前面那一串都是包名。
完整demo代码如下:

#include "SharedObject2.h"
#include <android/log.h>
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "SharedObject2", __VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "SharedObject2", __VA_ARGS__))

extern "C" {
	/*此简单函数返回平台 ABI,此动态本地库为此平台 ABI 进行编译。*/
	const char * SharedObject2::getPlatformABI()
	{
	#if defined(__arm__)
	#if defined(__ARM_ARCH_7A__)
	#if defined(__ARM_NEON__)
		#define ABI "armeabi-v7a/NEON"
	#else
		#define ABI "armeabi-v7a"
	#endif
	#else
		#define ABI "armeabi"
	#endif
	#elif defined(__i386__)
		#define ABI "x86"
	#else
		#define ABI "unknown"
	#endif
		LOGI("This dynamic shared library is compiled with ABI: %s", ABI);
		return "This native library is compiled with ABI: %s" ABI ".";
	}
	extern "C" jstring Java_com_example_myapplication_MainActivity_HelloWorld(JNIEnv * env, jclass jcls) {
		LOGI("init", "012");
		return env->NewStringUTF("Hello World!");
	}
	void SharedObject2()
	{
	}

	SharedObject2::SharedObject2()
	{
	}

	SharedObject2::~SharedObject2()
	{
	}
}


生成完毕后AS新建工程、、、
而后开始配置build.gradle:
JNI小记1 -- VS生成so给AS调用

这里也是参考网上的一个配置脚本,把ndk和sourcesSet配置一下:

plugins {  
    id 'com.android.application'  
}  
  
android {  
    namespace 'com.example.myapplication'  
    compileSdk 32  
  
    defaultConfig {  
        applicationId "com.example.myapplication"  
        minSdk 26  
        targetSdk 32  
        versionCode 1  
        versionName "1.0"  
  
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"  
        ndk {  
            //针对自己项目的架构对应添加相应的so目录  
            //目前的手机架构基本上都是arm架构,x86的基本上没有,基本上是平板  
            abiFilters "armeabi-v7a",//arm架构的32位  
                    "armeabi",//十年前的手机CPU架构,基本上已经不存在了  
                    "arm64-v8a",//arm架构的64位  
                    "x86",//x86架构的 32位  
                    "x86_64"//x86架构的64位  
        }  
    }  
    buildTypes {  
        release {  
            minifyEnabled false  
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'  
        }  
    }    compileOptions {  
        sourceCompatibility JavaVersion.VERSION_1_8  
        targetCompatibility JavaVersion.VERSION_1_8  
    }  
    buildFeatures {  
        viewBinding true  
    }  
    sourceSets {  
        main {  
            //这里的libs需要替换成你放置so库的目录,比如jniLibs  
            jniLibs.srcDirs = ['libs']  
        }  
    }}  
  
dependencies {  
  
    implementation 'androidx.appcompat:appcompat:1.4.1'  
    implementation 'com.google.android.material:material:1.5.0'  
    implementation 'androidx.constraintlayout:constraintlayout:2.1.3'  
    implementation 'androidx.navigation:navigation-fragment:2.4.1'  
    implementation 'androidx.navigation:navigation-ui:2.4.1'  
    testImplementation 'junit:junit:4.13.2'  
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'  
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'  
}

接着放上我们的lib:
JNI小记1 -- VS生成so给AS调用

static:
JNI小记1 -- VS生成so给AS调用

引用:
JNI小记1 -- VS生成so给AS调用
跑起来:
JNI小记1 -- VS生成so给AS调用文章来源地址https://www.toymoban.com/news/detail-413592.html

到了这里,关于JNI小记1 -- VS生成so给AS调用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • aarch64-linux-gcc安装编译及生成so动态库和调用

    官方二进制下载 Ubuntu packages 提供了软件包: gcc-arm-linux-gnueabihf (4:7.4.0-1ubuntu2.3 以及其他的) 。 建议直接从 linaro 的官网下载相应版本的 gcc-linaro 交叉编译工具,并直接选择带有二进制的文件,即在官网入口处选择 binaries 路径,该文件夹下面包含各种版本的已经编译好的 aarch

    2024年02月13日
    浏览(58)
  • VS2022环境下C++ DLL动态链接库的编写和调用

    1、新建动态链接库项目 2、新建类 3、宏定义 4、使用宏定义修饰类 调用DLL动态链接库大致有两种方法: 一种是“隐式调用”,需要.h头文件、.lib符号文件、.dll动态库文件; 一种是“显示调用”,需要.dll动态库文件; 此处介绍第一种调用方式。 1、创建项目 2、项目属性

    2024年02月14日
    浏览(49)
  • Windows11环境下VS2019调用Pytorch语义分割模型(C++版)

             语义分割模型在训练时往往采用python脚本进行网络搭建和训练,并获得训练好的模型。为了提高效率方便整个工程项目部署,实际工程应用中通常希望使用C++编程语言调用训练好的网络模型。查询大量网络资料并踩过无数坑后,经实际测试实现了在window11环境下调用

    2024年02月14日
    浏览(62)
  • VS2015项目中,MFC内存中调用DLL函数(VC6生成的示例DLL)

    本例主要讲一下,用VC6如何生成DLL,用工具WinHex取得DLL全部内容,VC2015项目加载内存中的DLL函数,并调用函数的示例。         本例中的示例代码下载,点击可以下载 1.新建项目,这里选择Win32 Dynamic-link Library,如下图:  2.选择“A simple DLL project”,然后点击完成,如下:

    2024年02月12日
    浏览(46)
  • Android:JNI实战,理论详解、Java与Jni数据调用

    上一篇博文《Android:JNI实战,加载三方库、编译C/C++》讲解了如何搭建一个可以加载和链接第三方库、编译 C/C++ 文件的 Jni Demo App。 这篇博文在这个 Jni Demo App 的基础上,从实战出发详细讲解  Jni  开发语法。 接下来,先用一小节将 Jni 开发比较重要的理论知识点过一下,然

    2024年01月23日
    浏览(47)
  • Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV

        OpenCV是大型的Third party 计算机视觉库,在开发中会经常用到,本篇记录一下 在Ubuntu系统上安装和配置OpenCV,并使用C/C++调用OpenCV 关于VS Code配置C/C++开发环境的部分,见之前的博文 Linux/Ubuntu系统下使用VS Code配置C/C++开发环境。 1. 准备工作 (1)更新下环境 (2)安装编译器

    2024年02月05日
    浏览(42)
  • Java使用JNI实现C文件的调用

    构建最基本的maven类型就行,文件结构如下: 其中最主要的类如下: main方法可有可无,只是用来测试的。 给IDEA做一个额外工具类: 在File-Settings–Tools–External Tools下新建。 Name和Description随意,Name会在下面用到。重要的的下面三个: build java项目,在.class上点击鼠标右键—

    2024年02月15日
    浏览(40)
  • C++通过JNI调用JAVA方法返回ArrayList对象

    运行效果:   JAVA实现: 获取系统已安装应用列表并返回ListString对象 C++ JNI实现:

    2024年02月11日
    浏览(47)
  • Android JNI复杂用法,回调,C++中调用Java方法

    Android JNI的 普通用法估计很多人都会,但是C++中调用Java方法很多人不熟悉,并且网上很多介绍都是片段的。 虽然C/C++调用Java不常用,但是掌握多一点还是有好处的。 Android JNI的基础知识介绍,之前已经有介绍,不熟悉的可以先看看: Android Jni的介绍和简单Demo实现: https://

    2024年03月26日
    浏览(48)
  • C#生成dll给c++调用 方法二COM方式 vs2022 NO Make Assembly COM-Visible选错了 不需要clr

    有些C++项目中也用了C语言.c,用方法一就无法使用【不能使用 /clr 选项编译 C 文件】。就用方法2。  参考:  https://www.5axxw.com/questions/content/2ozion  1.C# 生成dll     编译正常,C# dll就完成了。 2.C++调用示例

    2024年02月14日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包