마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

.so파일 사용하기 질문입니다.

0 추천
리눅스 os에서 빌드된 .so파일을 Android Studio에서 사용하고싶습니다.

Android Studio내에서 Cpp의 내용을 정의하고 JAVA에서 인터페이스 함수를 정의해서 사용하는법은

검색해서 어느정도 알겠으나, 단순히? .so파일을 가져와서 사용하는것은

어떻게 접근해야할지 막막하네요 ㅠ

감사합니다.
QDQ82 (160 포인트) 님이 9월 4일 질문

1개의 답변

0 추천

jni wapper 를 만들어야 합니다.

이하 chatgpt로 생성한 ffmpeg jni wapper 예제 입니다. 
chatgpt 특성상 동작 안 할 수는 있으나, 사용법은 비슷하니, 참조 하시라고 동봉 해 드립니다.

 

안드로이드에서 libffmpeg.so의 avformat_open_input을 호출하기 위해서는, JNI (Java Native Interface) 래퍼를 만들어 C/C++ 코드를 자바 코드와 연결해야 합니다. 아래 단계에 따라 JNI 래퍼를 생성할 수 있습니다.

FFmpeg 컴파일 및 .so 파일 준비: 먼저 FFmpeg를 Android용으로 컴파일하여 libffmpeg.so 파일을 생성합니다. 이를 위해 FFmpeg 소스를 Android NDK 환경에서 빌드해야 합니다.

JNI 래퍼 생성: JNI는 자바 코드에서 C/C++ 네이티브 코드를 호출할 수 있게 해줍니다. 먼저 C/C++로 JNI 메서드를 구현한 후 자바에서 이를 호출하도록 연결합니다.

C/C++ 코드에서 FFmpeg 함수 호출: FFmpeg의 avformat_open_input과 같은 함수를 호출하는 코드를 작성합니다.

Step 1: Android.mk 및 CMakeLists.txt 설정
우선, Android NDK를 사용해 FFmpeg 라이브러리를 Android에 맞게 빌드한 후, Android 프로젝트의 jniLibs에 .so 파일을 포함해야 합니다. 그 다음, CMakeLists.txt나 Android.mk 파일에서 FFmpeg 라이브러리를 참조합니다.

cmake
코드 복사
# CMakeLists.txt 예시
cmake_minimum_required(VERSION 3.4.1)

add_library(ffmpeg-lib SHARED IMPORTED)
set_target_properties(ffmpeg-lib PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libs/armeabi-v7a/libffmpeg.so)

# native-lib.cpp 파일을 빌드
add_library(native-lib SHARED src/main/cpp/native-lib.cpp)

find_library(log-lib log)

target_link_libraries(native-lib ffmpeg-lib ${log-lib})
Step 2: JNI 네이티브 코드 작성
C/C++ 코드 (native-lib.cpp)
avformat_open_input를 호출하는 JNI 함수를 작성합니다. 먼저, FFmpeg 헤더 파일을 포함하고 JNI 함수를 정의합니다.

cpp
코드 복사
#include <jni.h>
#include <string>
#include <android/log.h>

extern "C" {
    #include "libavformat/avformat.h"
}

#define LOG_TAG "FFmpegJNI"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)

extern "C" JNIEXPORT jint JNICALL
Java_com_example_myapp_FFmpegWrapper_avformatOpenInput(JNIEnv *env, jobject thiz, jstring input_path) {
    const char *input_path_cstr = env->GetStringUTFChars(input_path, nullptr);
    AVFormatContext *format_context = nullptr;
    
    // FFmpeg 함수 호출
    int result = avformat_open_input(&format_context, input_path_cstr, nullptr, nullptr);
    
    // 결과 확인
    if (result < 0) {
        LOGE("Could not open input: %s", input_path_cstr);
        env->ReleaseStringUTFChars(input_path, input_path_cstr);
        return result; // 에러 코드 리턴
    }

    LOGE("Input opened successfully: %s", input_path_cstr);

    // 리소스 정리
    avformat_close_input(&format_context);
    env->ReleaseStringUTFChars(input_path, input_path_cstr);

    return 0; // 성공적으로 열었을 경우
}
Step 3: 자바 래퍼 작성
자바 측에서 네이티브 함수를 호출할 수 있도록 JNI 래퍼를 자바 클래스에서 선언합니다.

java
코드 복사
package com.example.myapp;

public class FFmpegWrapper {
    static {
        System.loadLibrary("native-lib"); // 네이티브 라이브러리 로드
    }

    // 네이티브 메서드 선언
    public native int avformatOpenInput(String inputPath);

    // 래퍼 메서드
    public int openInput(String path) {
        return avformatOpenInput(path);
    }
}
Step 4: AndroidManifest 및 권한 설정
네이티브 라이브러리와 관련된 권한이나 설정을 추가합니다. 예를 들어, 파일 읽기를 위해 외부 저장소 권한이 필요할 수 있습니다.

xml
코드 복사
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Step 5: 네이티브 메서드 호출
FFmpegWrapper 클래스를 사용하여 자바에서 FFmpeg의 avformat_open_input를 호출할 수 있습니다.

java
코드 복사
FFmpegWrapper ffmpegWrapper = new FFmpegWrapper();
int result = ffmpegWrapper.openInput("/sdcard/sample.mp4");

if (result < 0) {
    Log.e("FFmpeg", "Failed to open input file.");
} else {
    Log.i("FFmpeg", "Input file opened successfully.");
}
이제 안드로이드에서 FFmpeg의 avformat_open_input을 호출할 수 있습니다.

 

익명사용자 님이 9월 7일 답변
...