【问题标题】:Getting AndroidJavaException in Unity when trying to call class constructor尝试调用类构造函数时在 Unity 中获取 AndroidJavaException
【发布时间】:2017-07-01 09:37:48
【问题描述】:

我在 Unity 中使用这个 C# 代码来访问 Java 类是 .aar lib:

 AndroidJavaClass ajc;
    private AndroidJavaObject ajo;
    // Use this for initialization
    void Start () {
        ajc = new AndroidJavaClass("com.example.pc.superpoweredsdk.SuperPoweredPlayerWrapper");
        ajo = ajc.Get<AndroidJavaObject>("currentActivity");
    }

但我在 android 上的 logcat 中收到此错误:

AndroidJavaException: java.lang.NoSuchFieldError: no "Ljava/lang/Object;" “Lcom/example/pc/superpoweredsdk/SuperPoweredPlayerWrapper;”类中的“currentActivity”字段或其超类 07-01 12:31:08.640 1467 1485 I Unity:java.lang.NoSuchFieldError:没有“Ljava/lang/Object;” “Lcom/example/pc/superpoweredsdk/SuperPoweredPlayerWrapper;”类中的“currentActivity”字段或其超类

这是我试图调用的 Java 类和函数:

public class SuperPoweredPlayerWrapper {
    public SuperPoweredPlayerWrapper(Context context) {
        int sampleRate = 44100;
        int bufferSize = 512;
        AssetFileDescriptor fd = context.getResources().openRawResourceFd(R.raw.lycka);
        int fileOffset = (int)fd.getStartOffset();
        int fileLength = (int)fd.getLength();
        try {
            fd.getParcelFileDescriptor().close();
        } catch (IOException e) {
            android.util.Log.d("", "Close error.");
        }
        SuperpoweredPlayer(sampleRate, bufferSize, context.getPackageResourcePath(), fileOffset, fileLength);
    }

    private native void SuperpoweredPlayer(int sampleRate, int bufferSize, String apkPath, int fileOffset, int fileLength);
    public native void playPause(boolean play);
    public native void setTempo(double value);

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

如何使用 Unity 中的上下文参数调用此类构造函数?

【问题讨论】:

    标签: c# android unity3d


    【解决方案1】:

    currentActivity 是 com.unity3d.player.UnityPlayer 的成员。

    所以,这段代码将获取上下文

    AndroidJavaClass ajc;
    AndroidJavaObject ajo,context;
    ajc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            ajo = ajc.Get<AndroidJavaObject>("currentActivity");
    context = ajo.Call<AndroidJavaObject>("getApplicationContext");
    

    然后你可以根据上下文做任何你想做的事情。

    调用构造函数:

    AndroidJavaObject yourClassObject = new AndroidJavaObject("com.example.pc.superpoweredsdk.SuperPoweredPlayerWrapper",new object[]{context});
    

    【讨论】:

    • 感谢回复,现在有了上下文,Unity 成功找到函数并调用它们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多