簡體   English   中英

如何在Java Android Studio項目中使用.so共享庫

[英]How Do You Use .so Shared Library in Java Android Studio Project

在過去的幾天里,我一直在解決這個問題。 我正在嘗試使用live555( http://www.live555.com/ ),一個C / C ++流媒體服務器,作為Java Android Studio項目中的庫。 我已經能夠使用ndk-build來創建一組.so文件,但是我找不到任何關於如何在我的Java應用程序中使用該庫的文檔。 這是我的設置:

  • Windows 8.1 64位
  • Oracle JDK 1.8
  • Android Studio 1.5.1
  • Gradle 1.5.0
  • 構建工具23.0.2

到目前為止我所采取的步驟:

  1. 使用Android Studio創建標准Android應用程序。
  2. 右鍵單擊Project explorer中的app模塊,然后選擇New | 文件夾| 上下文菜單中的JNI文件夾。
  3. http://www.live555.com/liveMedia/public/下載live555來源,選擇live555-latest.tar.gz文件。
  4. 將源提取到JNI文件夾,這樣您現在可以擁有如下文件夾結構:
    $ PROJECT_DIR
    | --app
    | - | --src
    | - | - | - 主
    | - | - | - | --jni
    | - | - | - | - | --live
    live文件夾包含live555源的位置。
  5. 在上面的jni文件夾中,創建Android.mkApplication.mk文件。 Application.mk文件包含:

     APP_OPTM := release APP_ABI := armeabi armeabi-v7a APP_PLATFORM := android-21 APP_STL := stlport_shared 

    Android.mk文件包含:

     LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := live555 LOCAL_SRC_FILES := \\ live\\BasicUsageEnvironment\\BasicHashTable.cpp \\ live\\BasicUsageEnvironment\\BasicTaskScheduler0.cpp \\ ...All of the rest of the .c and .cpp files LOCAL_C_INCLUDES := \\ $(LOCAL_PATH)\\live \\ $(LOCAL_PATH)\\live\\BasicUsageEnvironment\\include \\ $(LOCAL_PATH)\\live\\BasicUsageEnvironment \\ $(LOCAL_PATH)\\live\\UsageEnvironment\\include \\ $(LOCAL_PATH)\\live\\UsageEnvironment \\ $(LOCAL_PATH)\\live\\groupsock\\include \\ $(LOCAL_PATH)\\live\\groupsock \\ $(LOCAL_PATH)\\live\\liveMedia\\include \\ $(LOCAL_PATH)\\live\\liveMedia \\ LOCAL_CPPFLAGS += -fPIC -fexceptions -DXLOCALE_NOT_USED=1 -DNULL=0 -DNO_SSTREAM=1 -UIP_ADD_SOURCE_MEMBERSHIP include $(BUILD_SHARED_LIBRARY) 
  6. 在我的$PROJECT_DIR\\gradle.properties文件中,我包含了android.useDeprecatedNdk=true

  7. $PROJECT_DIR\\local.properties ,我有:

     ndk.dir=C\\:\\\\Users\\\\user\\\\AppData\\\\Local\\\\Android\\\\ndk sdk.dir=C\\:\\\\Users\\\\user\\\\AppData\\\\Local\\\\Android\\\\sdk 
  8. 在我的$PROJECT_DIR\\app\\build.gradle文件中,我有:

     apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId "com.company.android.myapp" minSdkVersion 21 targetSdkVersion 23 versionCode 1 versionName "1.0" ndk { moduleName "live555" } sourceSets.main { jni.srcDirs = [] jniLibs.srcDir "src\\\\main\\\\libs" } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.1.1' } 
  9. 然后我在$PROJECT_DIR\\app\\src\\main\\jni文件夾中運行ndk-build

ndk-build命令導致以下文件夾結構/文件輸出:
$ PROJECT_DIR
| --app
| - | --src
| - | - | - 主
| - | - | - | --libs
| - | - | - | - | --armeabi
| - | - | - | - | - | --liblive555.so
| - | - | - | - | - | --libstlport_shared.so
| - | - | - | - | --armeabi-V7A
| - | - | - | - | - | --liblive555.so
| - | - | - | - | - | --libstlport_shared.so
| - | - | - | --obj
| - | - | - | - | --local
| - | - | - | - | - | --armeabi
| - | - | - | - | - | - | --objs
| - | - | - | - | - | - | --liblive555.so
| - | - | - | - | - | - | --libstlport_shared.so
| - | - | - | - | - | --armeabi-V7A
| - | - | - | - | - | - | --objs
| - | - | - | - | - | - | --liblive555.so
| - | - | - | - | - | - | --libstlport_shared.so

當我從Build |中構建項目時 創建項目菜單選項,我在Android視圖中有一個項目結構,如下所示:
應用
| --manifests
| --java
| --jniLibs
| - | --armeabi
| - | - | --liblive555.so
| - | - | --libstlport_shared.so
| - | --armeabi-V7A
| - | - | --liblive555.so
| - | - | --libstlport_shared.so
| --res

我在我的項目中添加了一個Live555Ndk.java文件,從該文件開始引用live555庫。 它包含:

package com.company.android.myapp;

public class Live555Ndk {

    static {
        System.loadLibrary("live555");
    }

}

但是,我不知道如何開始創建對象實例並在live555庫上調用方法,因為我有共享對象。 誰能指出我正確的方向?

感謝您的任何見解。

更新 02/15/2016

好的,我已根據mcwise的以下建議從app \\ build.gradle文件中刪除了ndk {}塊。

我想我現在已經開始思考它是如何工作的,但我仍然無法引用live555庫。 我用一個活動和相應的布局文件開始了一個新的Android項目。 我添加了一個jniLibs文件夾,並將armeabi \\ liblive555.so等文件復制到該文件夾​​中。 我在前面提到的Live555Ndk.java文件中添加了靜態構造函數並調用SystemloadLibrary("live555"); 我還添加了對public native boolean isThisMediaSession();的調用public native boolean isThisMediaSession(); 然后我使用javah在jni文件夾中生成頭文件。 然后我創建了相應的.cpp文件來創建方法實現。 但是,我不能包含liblive555.so中的任何頭文件。 這就像Android Studio甚至不知道live555庫的存在。 所以,我不能有像#include <live555/MediaSession.hh>這樣的行。 我錯過了一個額外的步驟嗎? 這個Android項目只有.so文件,而不是源文件。 我是否需要將live555源添加到jni文件夾?

查看Google開發的許多Android NDK示例。 你可以在這里找到它們。

hello-gl2示例是一個很好的起點。

gl_code.cpp向您展示了如何創建可以從Java調用的JNI代碼。 特別注意代碼的這一部分,它定義了兩個方法並使它們對Java層可見:

extern "C" {
  JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_init(JNIEnv * env,
    jobject obj,  jint width, jint height);
  JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_step(JNIEnv * env, 
    jobject obj);
};

JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_init(JNIEnv * env, jobject obj,  jint width, jint height)
{
  setupGraphics(width, height);
}

JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_step(JNIEnv * env, jobject obj)
{
  renderFrame();
}

GL2JNILib.java向您展示如何從Java調用gl_code.cpp中定義的方法。

public class GL2JNILib {

  static {
    System.loadLibrary("gl2jni");
   }

  /**
   * @param width the current view width
   * @param height the current view height
   */
   public static native void init(int width, int height);
   public static native void step();
}

更新:

要構建依賴live555庫的C ++模塊,您需要將以下部分添加到Android.mk:

include $(CLEAR_VARS)
LOCAL_MODULE := your_module
LOCAL_SRC_FILES := your_module_file.cpp
LOCAL_SHARED_LIBRARIES := live555
include $(BUILD_SHARED_LIBRARY)

請參閱此文檔以供參考:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM