6

そこで、https://github.com/libpd/pd-for-androidから git リポジトリを取得し、「AmazingSynthesizer」用に Android Studio で新しい空のプロジェクトを作成しました。

「モジュールのインポート」ウィザードを使用して、PdCore と AndroidMidi をインポートしました。次に、「アプリ」を右クリックして「モジュール設定」を表示します。依存関係の下に、モジュールの依存関係として PdCore を追加しました。また、「PdCore」の依存モジュールとして AndroidMidi を追加しました。

これまでのところ、それは私には正しいように思えました。私のアプリの build.gradle にはライブラリが含まれており、MainActivity に PdDispatcher をインポートできます。問題は、ネイティブ ライブラリがまだ不足しているように見えることです (私はそう思います!)。

libpd の公式本 (Making Musical Apps by Peter Brinkmann) の非常に基本的なサンプル コード

PdAudio.initAudio(sampleRate, 0, 2, 8, true);

惨めに失敗する

java.lang.UnsatisfiedLinkError: Couldn't load pd from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.app.amazingsynthesizer-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.app.amazingsynthesizer-1, /vendor/lib, /system/lib]]]: findLibrary returned null
        at java.lang.Runtime.loadLibrary(Runtime.java:358)
        at java.lang.System.loadLibrary(System.java:526)
        at org.puredata.core.PdBase.<clinit>(PdBase.java:55)
        at org.puredata.android.io.PdAudio.startAudio(PdAudio.java:86)
        at com.app.amazingsynthesizer.MainActivity.onResume(MainActivity.java:62)
        at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1192)
        at android.app.Activity.performResume(Activity.java:5310)
        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2764)
        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2803)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2238)
        at android.app.ActivityThread.access$800(ActivityThread.java:135)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5001)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
        at dalvik.system.NativeStart.main(Native Method)
4

5 に答える 5

7

[2016.03.07更新]

pd-for-android プロジェクトの更新による新たな状況に伴い、ブログ記事も更新しました。ここを見てください:

ブログ投稿: http://www.journal.deviantdev.com/pure-data-for-android-jcenter-gradle-dependecy/

サンプル プロジェクト: http://www.journal.deviantdev.com/sample-libpd-android-studio/


[元の回答]

基本的に、この質問はさまざまな方法で回答されますが、私の考えを共有するために別の回答を追加したいと思います. Androidスタジオでlibpdを実行するさまざまな方法を文書化し、更新しました。重要な手順を要約します。

  1. Android Studio を入手する
  2. GitHubから pd-for-android をダウンロードします
  3. Android Studio で新しいプロジェクトを作成する
  4. AndroidMidi をモジュールとして Android Studio にインポートする
  5. PDCore をモジュールとして Android Studio にインポートする
  6. AndroidMidi の依存関係を PDCore に追加します
  7. PDCore の依存関係をアプリに追加する

これで、それを機能させる方法が 2 つあります。NDK を使用して pd-for-android をビルドし、依存関係を追加するか、jniLibs.srcDirs = ['src', 'libs']" を PdCore build.gradle に追加することができます。デフォルトで pd-for-android に付属していないいくつかの外部をコンパイルします。

ここでは、Android Studio の詳細とサンプル プロジェクトを提供するいくつかの投稿を見つけることができます。

幸運を!

于 2015-03-28T17:01:13.460 に答える
3

私は同じ問題を抱えていました。それを修正するには、Android gradle プラグインに jni ファイル (.so) の場所を伝える必要がありました。

android {

// omitted ...

  sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src', 'jni/libpd/java']
        resources.srcDirs = ['src', 'jni/libpd/java']
        aidl.srcDirs = ['src', 'jni/libpd/java']
        renderscript.srcDirs = ['src', 'jni/libpd/java']

        // ** this is what was missing **
        jniLibs.srcDirs = ['src', 'libs']

        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
    }
  }
}

完全なbuild.gradleファイルは、元の libpd-for-android リポジトリから作成したフォークで確認できます。私はそこで新しいバージョンの Android gradle プラグインを使用しており、Android Studio でうまく動作します。

https://github.com/tkirshboim/pd-for-android/

-- 2015 年 6 月 30 日からの更新 --

私の pd-for-android フォークは @github/joebowbeer によって拡張されたため、gradle サポートが改善され、gradle と Android NDK を使用して .aar ファイルを作成できるようになりました。したがって、純粋なデータを使用する新しい Android プロジェクトを作成するときに、pd-for-android コード + バイナリをコピーする必要はなくなりました。この更新されたフォークのプル リクエストは、すぐにマスター ブランチにマージされるはずです。それまでは、このフォークをここから複製できます。

https://github.com/joebowbeer/pd-for-android/tree/gradle_mods

この質問に対する@sdaauの回答についてコメントするほどの評判はまだありませんが、Android Studio が NDK をサポートしないというのは誤りです。NDK は、バージョン 1.3 以降の Android Studio でサポートされています。ここからダウンロードできます。

于 2015-01-31T18:50:16.757 に答える
2

私は同じ問題を抱えていました。短くするには、プロジェクトに *.so ファイルを依存関係として含めるように gradle に指示する必要があります (自動的には行われません)。

この回答を見て問題を解決できました: https://stackoverflow.com/a/17974618お 役に立てば幸いです。

編集:忘れました: PdCore プロジェクトを でコンパイルする必要もありましたndk-build。フォルダー内のファイルに関するエラーが発生した場合opensl_streamは、それらが別の git リポジトリへのリンクであるため、それらが正しく取得されていることを確認してください (手動でフォルダーにコピーしただけです...最善の解決策ではありませんが、機能しました)。

乾杯

于 2014-09-07T21:18:07.107 に答える
0

@kirsh300の回答のおかげで、Android 用の新しいリポジトリにたどり着きましたgitlibpd、それでもビルド プロセスは簡単ではありませんでした。これは複雑なままになる可能性が高いため ( Android Studio の「Current NDK support is deprecated」libpdを参照)、古い Linux ボックスで Android をビルドするために必要だった bash スクリプトを以下に示します。

最初の問題は、私のインストールが非標準のディレクトリにあることです。次に、Linux 用の古い (古い) Android Studio Bundle 135.1078000 (20140321 から) の SDK を使用しました。これはデフォルトで最大 API 19 になります。デフォルトでは他の API をインストールしません。ただし、の現在のリビジョンはlibpd、API 17 と API 21 の両方を参照しています。API 17$ANDROID_HOME/tools/androidは、Android SDK Manager であるコマンドを呼び出して手動でインストールしましたが、API 21 は、以下のスクリプトでファイルにパッチを適用して 19 にダウングレードしました。そのため、インストール済みの Android SDK マネージャーは次のように表示されます。

sdk.png

2 番目の問題は、この SDK にgradlewはバージョン 1.10 が付属していることです。一方、レポにgradlewチェックインされている現在のバージョンは(最初の呼び出し時に、正しいバージョンをダウンロードしようとします)。覚えておくべきことは、SDK から を呼び出さないことです。たとえば、(" com.android.build.gradle.LibraryExtension_Decorated@3e3c83 でプロパティ 'ndkDirectory' が見つかりませんでした")、または( 「com.android.build.gradle.internal.api.LibraryVariantImpl_Decorated@97447e でプロパティ 'outputs' が見つかりませんでした」)スクリプト内のコンストラクト - したがって、リポジトリの 2.4 を使用する必要があります (したがって、スクリプト内の相対パス)。libpd2.4gradlegradlewandroid.ndkDirectoryvariant.outputs.eachbuild.gradlegradlew

スクリプトは次のとおりです。

#!/usr/bin/env bash

# wget http://dl.google.com/android/studio/install/0.5.2/android-studio-bundle-135.1078000-linux.tgz
# wget http://dl.google.com/android/ndk/android-ndk-r10e-linux-x86.bin
# unpack downloads - and modify these to your actual absolute paths (also for JAVA_HOME below):
ADTSDK=/path/to/adt-bundle-linux-x86-20140321/sdk
ADNDK=/path/to/android-ndk-r10e
# these seem to not really matter? nvm, keep:
export ANDROID_HOME=$ADTSDK
export ANDROID_NDK_HOME=$ADNDK

set -x

# only run if the subdirectory pd-for-android not created yet:
if [ ! -d "pd-for-android" ]; then
  #git clone https://github.com/libpd/pd-for-android.git # no, OLD!
  git clone https://github.com/tkirshboim/pd-for-android.git
  cd pd-for-android
  # checkout specific version to make sure this test works when the repo changes:
  git checkout -f c5ea734c5aac7f2d37141e287bd0102706d54e55
  # create root/top-level local.properties, esp. for sdk.dir:
  echo "ndk.dir=$ADNDK" > local.properties 
  echo "sdk.dir=$ADTSDK" >> local.properties
  # downgrade API version:
  sed -i 's_compileSdkVersion 21_compileSdkVersion 19 //21_' PdTest/build.gradle
  sed -i 's_buildToolsVersion "21.1.2"_buildToolsVersion "19.1" //"21.1.2"_' PdTest/build.gradle
  sed -i "s_targetSdkVersion 21_targetSdkVersion 19 //21_" PdTest/build.gradle
  sed -i 's_compileSdkVersion 21_compileSdkVersion 19 //21_' CircleOfFifths/build.gradle
  sed -i 's_buildToolsVersion "21.1.2"_buildToolsVersion "19.1" //"21.1.2"_' CircleOfFifths/build.gradle
  sed -i "s_targetSdkVersion 21_targetSdkVersion 19 //21_" CircleOfFifths/build.gradle
  sed -i 's_compileSdkVersion 21_compileSdkVersion 19 //21_' ScenePlayer/build.gradle
  sed -i 's_buildToolsVersion "21.1.2"_buildToolsVersion "19.1" //"21.1.2"_' ScenePlayer/build.gradle
  sed -i "s_targetSdkVersion 21_targetSdkVersion 19 //21_" ScenePlayer/build.gradle
  sed -i 's_compileSdkVersion 21_compileSdkVersion 19 //21_' Voice-O-Rama/build.gradle
  sed -i 's_buildToolsVersion "21.1.2"_buildToolsVersion "19.1" //"21.1.2"_' Voice-O-Rama/build.gradle
  sed -i "s_targetSdkVersion 21_targetSdkVersion 19 //21_" Voice-O-Rama/build.gradle
  cd PdCore
  sed -i 's_compileSdkVersion 21_compileSdkVersion 19 //21_' build.gradle
  sed -i "s_buildToolsVersion '21.1.2'_buildToolsVersion '19.1' //'21.1.2'_" build.gradle # The SDK Build Tools revision (19.0.3) is too low for project ':PdCore'. Minimum required is 19.1.0 - install via Android SDK manager
  sed -i "s_targetSdkVersion 21_targetSdkVersion 19 //21_" build.gradle
  # check if tasks pass:
  ../gradlew tasks || { echo 'tasks failed' ; exit 1; } # pulls gradle-2.4-all.zip;
  # build:
  # must specify JAVA_HOME here, else "FAILURE: Build failed ... Could not find tools.jar"
  JAVA_HOME=/path/to/jdk1.6.0_45 ../gradlew assembleRelease 
  cd ../..
fi
于 2015-07-24T17:14:00.697 に答える