6627


Androidで javaクラスの

[code]

    package com.xxx;
    
    public class hoge{
    
    public hoge(){}
    
    メソッド...
    
    }
    
[/code]

のメソッドにアクセスするときは、  
Plugins>Androidフォルダにそのjarを置いて

C#から

[code]

    AndroidJavaObject Instatnce = new AndroidJavaObject("com.xxx");
    var fuga = Instatnce.Call<戻り値>("メソッド名");
    
[/code]

などでいけるのですが、  
この方法だと以下の継承されたクラスにアクセスできません。

[code]

    package com.xxx;
    
    import android.support.v7.app.ActionBarActivity;
    
    public class hoge extends ActionBarActivity{
    
    public hoge(){}
    
    メソッド...
    
    }
    
[/code]

これは、上記のC#でアクセスすると  
java.lang.ClassNotFoundException エラーになってしまいます。

初歩的な質問かもしれませんがご指導お願いします。

↓  
AndroidのActivityという概念をまるで理解してなかったのですが、  
おかげで2つの方法でメソッドを呼べました。

java

[code]

     package com.xxx;
    
    import com.unity3d.player.UnityPlayerActivity;
    import com.unity3d.player.UnityPlayer;
    
    public class Hoge extends UnityPlayerActivity {
    
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        UnityPlayer.UnitySendMessage("Main Camera", "Hoge", "HOGEHOGE");
      }
    
      public String Fuga(){
          return "FUGAFUGA";
      }
    }
    
[/code]

このままだとエラーなので、Macでの

[code]

      /Applications/Unity/Unity.app/Contents/PlaybackEngines/classes.jar
    
[/code]

を追加して、jar化。  
Plugins>Androidフォルダにそのjarを置いて

AndroidManifest.xml で UnityPlayerActivity を拡張したHogeに変更。

[code]

        <activity android:name="Hoge"
                  android:label="@string/app_name">
    
[/code]

Main Camera オブジェクトに追加したC#コンポーネント

[code]

    using UnityEngine;
    using System.Collections;
    
    public class test : MonoBehaviour
    {
        void Start ()
        {
            // Unity インスタンスを取得
            AndroidJavaClass unityPlayer = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
    
            // 現在のアクティビティを取得
            AndroidJavaObject activ = unityPlayer.GetStatic<AndroidJavaObject> ("currentActivity");
    
            // インスタンスメソッドを呼ぶ
            Debug.Log(activ.Call<string> ("Fuga"));// FUGAFUGA
        }
    
            // javaからUnitySendMessageで送られてくる。
        void Hoge(string message){
            Degub.log(message); // HOGEHOGE
        }
    }
    
[/code]

以上、ありがとうございました。


CC BY-SA 3.0
2015-02-17T05:57:38.753
6622
2016-10-14T07:53:39.607
2015-02-19T05:57:21.870
7252
7252
question
android unity3d
Unity(C#)からAndroid(Java)のActivityを拡張したクラスにアクセスしたい


Android の `Activity` は、直接インスタンス化するものではないので、質問のコードが動いたとしても問題があります。また、
`AndroidManifest.xml` に対象のクラスを登録しておかねばならないかもしれません。

ドキュメントを見てみると、 `UnityPlayer`
クラスのスタティックフィールドを参照することで、アプリケーションで現在使用中のアクティビティを取得するという方法が簡単です。

[code]

    // Unity インスタンスを取得
    AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    
    // 現在のアクティビティを取得
    AndroidJavaObject activ = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
    
    // インスタンスメソッドを呼ぶ
    activ .Call("hoge");
    
[/code]

この方法は、下記ドキュメントの Example 2 になります。

  * [Unity Plugins for Android](http://docs.unity3d.com/Manual/PluginsForAndroid.html)
  * [Androidのプラグインをビルドする](http://docs-jp.unity3d.com/Documentation/Manual/PluginsForAndroid.html)
  * [Calling .jar function in unity](http://answers.unity3d.com/questions/330809/integration-of-jar-file-using-jni.html)

他の方法としては、
[`AndroidJavaObject`](http://docs.unity3d.com/ScriptReference/AndroidJavaObject.html)
の `Set`/`Get` メソッドで値の受け渡しをするか、 `UnityPlayerActivity` を拡張したアクティビティを
`AndroidManifest.xml` で登録し C# 側から参照するなどとなります。どちらもドキュメントに方法が示されています。


CC BY-SA 3.0
2015-02-17T06:58:17.783
6627
2015-02-17T06:58:17.783
4978
6622
answer