Android studio3 例子,Android Studio 3.2.1上vuh库使用的例子

Android Studio 3.2.1 上 vuh 库使用的例子,首先使用 基于Vulkan的GPGPU计算框架Vuh 编译出 Android 版本的动态库,然后依照如下步骤建立工程。

2d383a67af4945bc5b5678fac6978b96.png

9af851145f257c1a1b77a00afdbab41f.png

8e64ef2ea8c8115288111262beefe3d3.png

14b91846a934379d5b175db581d106ef.png

a28bf7dba7bc66a066c110bd1bb4dc4f.png

1861f6a1a2a4708e441789b896a0a56f.png

e5476c86c43d79d947c54f53fc174e9c.png

如下图所示,拷贝头文件跟动态库到指定的目录:

88acd5b6fedc9e7d48bb519032f29941.png

工程中几处关键的代码如下:

# For more information about using CMake with Android Studio, read the

# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.4.1)

# for Vulkan

add_definitions(-DVK_USE_PLATFORM_ANDROID_KHR=1 -DVULKAN_HPP_TYPESAFE_CONVERSION=1)

include_directories(src/main/cpp/include)

include_directories(${ANDROID_NDK}/sources/third_party/vulkan/src/include/)

add_library(vuh SHARED IMPORTED)

set_target_properties(vuh PROPERTIES IMPORTED_LOCATION  ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libvuh.so)

add_library(vulkan SHARED IMPORTED)

set_target_properties(vulkan PROPERTIES IMPORTED_LOCATION  ${ANDROID_NDK}/platforms/${ANDROID_PLATFORM}/arch-arm/usr/lib/libvulkan.so)

# Creates and names a library, sets it as either STATIC

# or SHARED, and provides the relative paths to its source code.

# You can define multiple libraries, and CMake builds them for you.

# Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.

native-lib

# Sets the library as a shared library.

SHARED

# Provides a relative path to your source file(s).

src/main/cpp/native-lib.cpp)

# Searches for a specified prebuilt library and stores the path as a

# variable. Because CMake includes system libraries in the search path by

# default, you only need to specify the name of the public NDK library

# you want to add. CMake verifies that the library exists before

# completing its build.

find_library( # Sets the name of the path variable.

log-lib

# Specifies the name of the NDK library that

# you want CMake to locate.

log

android)

# Specifies libraries CMake should link to your target library. You

# can link multiple libraries, such as libraries you define in this

# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.

native-lib

vulkan

vuh

# Links the target library to the log library

# included in the NDK.

${log-lib})

apply plugin: 'com.android.application'

android {

compileSdkVersion 28

defaultConfig {

applicationId "com.mobibrw.vuhandroid"

minSdkVersion 24

targetSdkVersion 28

versionCode 1

versionName "1.0"

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

externalNativeBuild {

cmake {

cppFlags "-std=c++14 -v -g"

abiFilters "armeabi-v7a"

}

}

}

buildTypes {

release {

minifyEnabled false

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

}

}

externalNativeBuild {

cmake {

path "CMakeLists.txt"

}

}

}

dependencies {

implementation fileTree(dir: 'libs', include: ['*.jar'])

implementation 'com.android.support:appcompat-v7:28.0.0'

implementation 'com.android.support.constraint:constraint-layout:1.1.3'

testImplementation 'junit:junit:4.12'

androidTestImplementation 'com.android.support.test:runner:1.0.2'

androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

}

package com.mobibrw.vuhandroid;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

// Used to load the 'native-lib' library on application startup.

static {

System.loadLibrary("vuh");

System.loadLibrary("native-lib");

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

// Example of a call to a native method

TextView tv = (TextView) findViewById(R.id.sample_text);

tv.setText(stringFromJNI());

}

/**

* A native method that is implemented by the 'native-lib' native library,

* which is packaged with this application.

*/

public native String stringFromJNI();

}

#include

#include

#include

#include

#include

auto saxpy()-> int {

auto y = std::vector(128, 1.0f);

auto x = std::vector(128, 2.0f);

const auto a = 0.1f; // saxpy scaling constant

auto instance = vuh::Instance();

auto device = instance.devices().at(0);  // just get the first compute-capable device

auto d_y = vuh::Array(device, y); // allocate memory on device and copy data from host

auto d_x = vuh::Array(device, x); // same for x

using Specs = vuh::typelist;

struct Params{uint32_t size; float a;};

auto program = vuh::Program(device, "saxpy.spv"); // define the kernel by linking interface and spir-v implementation

program.grid(128/64).spec(64)({128, a}, d_y, d_x); // run once, wait for completion

d_y.toHost(begin(y));                              // copy data back to host

return 0;

}

extern "C" JNIEXPORT jstring JNICALL

Java_com_mobibrw_vuhandroid_MainActivity_stringFromJNI(

JNIEnv *env,

jobject /* this */) {

std::string hello = "Hello from C++";

saxpy();

return env->NewStringUTF(hello.c_str());

}

点击此处下载完整的工程vuhAndroid

参考链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值