Add Chiaki Lib to Android

This commit is contained in:
Florian Märkl 2019-09-14 15:14:55 +02:00
commit 7fb4c67f33
No known key found for this signature in database
GPG key ID: 125BC8A5A6A1E857
11 changed files with 142 additions and 7 deletions

View file

@ -5,6 +5,10 @@ project(chiaki)
option(CHIAKI_ENABLE_TESTS "Enable tests for Chiaki" ON)
option(CHIAKI_ENABLE_CLI "Enable CLI for Chiaki" OFF)
option(CHIAKI_ENABLE_GUI "Enable Qt GUI" ON)
option(CHIAKI_ENABLE_ANDROID "Enable Android (Use only as part of the Gradle Project)" OFF)
option(CHIAKI_LIB_ENABLE_OPUS "Use Opus as part of Chiaki Lib" ON)
option(CHIAKI_LIB_OPENSSL_EXTERNAL_PROJECT "Use OpenSSL as CMake external project" OFF)
option(CHIAKI_GUI_ENABLE_QT_GAMEPAD "Use QtGamepad for Input" OFF)
option(CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER "Use SDL Gamecontroller for Input" ON)
option(CHIAKI_CLI_ARGP_STANDALONE "Search for standalone argp lib for CLI" OFF)
@ -20,15 +24,25 @@ add_subdirectory(third-party)
add_definitions(-DCHIAKI_VERSION_MAJOR=${CHIAKI_VERSION_MAJOR} -DCHIAKI_VERSION_MINOR=${CHIAKI_VERSION_MINOR} -DCHIAKI_VERSION_PATCH=${CHIAKI_VERSION_PATCH} -DCHIAKI_VERSION=\"${CHIAKI_VERSION}\")
if(CHIAKI_LIB_OPENSSL_EXTERNAL_PROJECT)
include(OpenSSLExternalProject)
endif()
add_subdirectory(lib)
if(CHIAKI_ENABLE_CLI)
add_subdirectory(cli)
endif()
add_subdirectory(gui)
if(CHIAKI_ENABLE_GUI)
add_subdirectory(gui)
endif()
if(CHIAKI_ENABLE_TESTS)
enable_testing()
add_subdirectory(test)
endif()
if(CHIAKI_ENABLE_ANDROID)
add_subdirectory(android/app)
endif()

View file

@ -0,0 +1,5 @@
cmake_minimum_required(VERSION 3.2)
add_library(chiaki-jni SHARED src/main/cpp/chiaki-jni.c)
target_link_libraries(chiaki-jni chiaki-lib)

View file

@ -13,6 +13,23 @@ android {
targetSdkVersion 29
versionCode 1
versionName "1.0"
externalNativeBuild {
cmake {
arguments "-DCHIAKI_ENABLE_TESTS=OFF",
"-DCHIAKI_ENABLE_CLI=OFF",
"-DCHIAKI_ENABLE_GUI=OFF",
"-DCHIAKI_ENABLE_ANDROID=ON",
"-DCHIAKI_LIB_ENABLE_OPUS=OFF",
"-DCHIAKI_LIB_OPENSSL_EXTERNAL_PROJECT=ON",
"-DCMAKE_VERBOSE_MAKEFILE=ON"
}
}
}
externalNativeBuild {
cmake {
version "3.10.2+"
path "../../CMakeLists.txt"
}
}
buildTypes {
release {

View file

@ -0,0 +1,9 @@
#include <jni.h>
#include <chiaki/common.h>
JNIEXPORT jstring JNICALL Java_com_metallic_chiaki_lib_Chiaki_stringFromJNI(JNIEnv* env, jobject thiz)
{
return (*env)->NewStringUTF(env, chiaki_error_string(CHIAKI_ERR_SUCCESS));
}

View file

@ -2,6 +2,8 @@ package com.metallic.chiaki
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.metallic.chiaki.lib.Chiaki
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity()
{
@ -9,5 +11,7 @@ class MainActivity : AppCompatActivity()
{
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
testTextView.text = Chiaki.stringFromJNI()
}
}

View file

@ -0,0 +1,14 @@
package com.metallic.chiaki.lib
class Chiaki
{
companion object
{
init
{
System.loadLibrary("chiaki-jni")
}
@JvmStatic external fun stringFromJNI(): String
}
}

View file

@ -7,6 +7,7 @@
tools:context=".MainActivity">
<TextView
android:id="@+id/testTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"

View file

@ -0,0 +1,52 @@
include(ExternalProject)
set(OPENSSL_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/openssl-install-prefix")
unset(OPENSSL_OS_COMPILER)
unset(OPENSSL_CONFIG_EXTRA_ARGS)
unset(OPENSSL_BUILD_ENV)
if(ANDROID_ABI)
if(ANDROID_ABI STREQUAL "armeabi-v7a")
set(OPENSSL_OS_COMPILER "android-arm")
elseif(ANDROID_ABI STREQUAL "arm64-v8a")
set(OPENSSL_OS_COMPILER "android-arm64")
elseif(ANDROID_ABI STREQUAL "x86")
set(OPENSSL_OS_COMPILER "android-x86")
elseif(ANDROID_ABI STREQUAL "x86_64")
set(OPENSSL_OS_COMPILER "android-x86_64")
endif()
set(OPENSSL_CONFIG_EXTRA_ARGS "-D__ANDROID_API__=${ANDROID_NATIVE_API_LEVEL}")
get_filename_component(ANDROID_NDK_BIN_PATH "${CMAKE_C_COMPILER}" DIRECTORY)
set(OPENSSL_BUILD_ENV "ANDROID_NDK_HOME=${ANDROID_NDK}" "PATH=${ANDROID_NDK_BIN_PATH}:$ENV{PATH}")
else()
if(UNIX AND NOT APPLE AND CMAKE_SIZEOF_VOID_P STREQUAL "8")
set(OPENSSL_OS_COMPILER "linux-x86_64")
endif()
endif()
if(NOT OPENSSL_OS_COMPILER)
message(FATAL_ERROR "Failed to match OPENSSL_OS_COMPILER")
endif()
find_program(MAKE_EXE NAMES gmake make)
ExternalProject_Add(OpenSSL-ExternalProject
URL https://www.openssl.org/source/openssl-1.1.1d.tar.gz
URL_HASH SHA256=1e3a91bc1f9dfce01af26026f856e064eab4c8ee0a8f457b5ae30b40b8b711f2
INSTALL_DIR "${OPENSSL_INSTALL_DIR}"
CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env ${OPENSSL_BUILD_ENV}
"<SOURCE_DIR>/Configure" "--prefix=<INSTALL_DIR>" no-shared ${OPENSSL_CONFIG_EXTRA_ARGS} "${OPENSSL_OS_COMPILER}"
BUILD_COMMAND ${CMAKE_COMMAND} -E env ${OPENSSL_BUILD_ENV} "${MAKE_EXE}" build_libs
INSTALL_COMMAND ${CMAKE_COMMAND} -E env ${OPENSSL_BUILD_ENV} "${MAKE_EXE}" install_dev)
add_library(OpenSSL_Crypto INTERFACE)
add_dependencies(OpenSSL_Crypto OpenSSL-ExternalProject)
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.13.0")
target_link_directories(OpenSSL_Crypto INTERFACE "${OPENSSL_INSTALL_DIR}/lib")
else()
link_directories("${OPENSSL_INSTALL_DIR}/lib")
endif()
target_link_libraries(OpenSSL_Crypto INTERFACE crypto)
target_include_directories(OpenSSL_Crypto INTERFACE "${OPENSSL_INSTALL_DIR}/include")

View file

@ -74,8 +74,11 @@ include_directories("${NANOPB_SOURCE_DIR}")
set_source_files_properties(${CHIAKI_LIB_PROTO_SOURCE_FILES} ${CHIAKI_LIB_PROTO_HEADER_FILES} PROPERTIES GENERATED TRUE)
include_directories("${CHIAKI_LIB_PROTO_INCLUDE_DIR}")
find_package(Opus REQUIRED)
include_directories(${Opus_INCLUDE_DIRS})
if(CHIAKI_LIB_ENABLE_OPUS)
find_package(Opus REQUIRED)
include_directories(${Opus_INCLUDE_DIRS})
add_definitions(-DCHIAKI_LIB_ENABLE_OPUS)
endif()
add_library(chiaki-lib ${HEADER_FILES} ${SOURCE_FILES} ${CHIAKI_LIB_PROTO_SOURCE_FILES} ${CHIAKI_LIB_PROTO_HEADER_FILES})
add_dependencies(chiaki-lib chiaki-pb)
@ -90,10 +93,16 @@ target_include_directories(chiaki-lib PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/includ
find_package(Threads REQUIRED)
target_link_libraries(chiaki-lib Threads::Threads)
find_package(OpenSSL REQUIRED)
target_link_libraries(chiaki-lib OpenSSL::Crypto)
if(CHIAKI_LIB_OPENSSL_EXTERNAL_PROJECT)
target_link_libraries(chiaki-lib OpenSSL_Crypto)
else()
find_package(OpenSSL REQUIRED)
target_link_libraries(chiaki-lib OpenSSL::Crypto)
endif()
target_link_libraries(chiaki-lib protobuf-nanopb-static)
target_link_libraries(chiaki-lib jerasure)
target_link_libraries(chiaki-lib ${Opus_LIBRARIES})
if(CHIAKI_LIB_ENABLE_OPUS)
target_link_libraries(chiaki-lib ${Opus_LIBRARIES})
endif()

View file

@ -18,7 +18,9 @@
#include <chiaki/audioreceiver.h>
#include <chiaki/session.h>
#ifdef CHIAKI_LIB_ENABLE_OPUS
#include <opus/opus.h>
#endif
#include <string.h>
@ -47,7 +49,9 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_audio_receiver_init(ChiakiAudioReceiver *au
CHIAKI_EXPORT void chiaki_audio_receiver_fini(ChiakiAudioReceiver *audio_receiver)
{
#ifdef CHIAKI_LIB_ENABLE_OPUS
opus_decoder_destroy(audio_receiver->opus_decoder);
#endif
chiaki_mutex_fini(&audio_receiver->mutex);
free(audio_receiver->pcm_buf);
}
@ -65,6 +69,7 @@ CHIAKI_EXPORT void chiaki_audio_receiver_stream_info(ChiakiAudioReceiver *audio_
CHIAKI_LOGI(audio_receiver->log, " unknown = %d", audio_header->unknown);
memcpy(&audio_receiver->audio_header, audio_header, sizeof(audio_receiver->audio_header));
#ifdef CHIAKI_LIB_ENABLE_OPUS
opus_decoder_destroy(audio_receiver->opus_decoder);
int error;
@ -97,6 +102,9 @@ CHIAKI_EXPORT void chiaki_audio_receiver_stream_info(ChiakiAudioReceiver *audio_
if(audio_receiver->session->audio_settings_cb)
audio_receiver->session->audio_settings_cb(audio_header->channels, audio_header->rate, audio_receiver->session->audio_cb_user);
#else
CHIAKI_LOGE(audio_receiver->log, "Opus disabled, not initializing decoder");
#endif
beach:
chiaki_mutex_unlock(&audio_receiver->mutex);
@ -160,6 +168,7 @@ CHIAKI_EXPORT void chiaki_audio_receiver_av_packet(ChiakiAudioReceiver *audio_re
static void chiaki_audio_receiver_frame(ChiakiAudioReceiver *audio_receiver, ChiakiSeqNum16 frame_index, uint8_t *buf, size_t buf_size)
{
#ifdef CHIAKI_LIB_ENABLE_OPUS
chiaki_mutex_lock(&audio_receiver->mutex);
if(!audio_receiver->opus_decoder)
@ -181,4 +190,5 @@ static void chiaki_audio_receiver_frame(ChiakiAudioReceiver *audio_receiver, Chi
beach:
chiaki_mutex_unlock(&audio_receiver->mutex);
#endif
}

View file

@ -72,7 +72,7 @@ CHIAKI_EXPORT void *chiaki_aligned_alloc(size_t alignment, size_t size)
{
#if defined(_WIN32)
return _aligned_malloc(size, alignment);
#elif __APPLE__
#elif __APPLE__ || __ANDROID__
void *r;
if(posix_memalign(&r, alignment, size) == 0)
return r;