2

Unity3D から単純なネイティブ関数 (C++) を呼び出そうとしています。私は次のことをしました:

  1. libMSDKWrapper.soAssets->Plugins->Android に配置

  2. これは私のC#コードです

    using UnityEngine;
    using System.Collections;
    using System.Runtime.InteropServices;
    
    public class facebooktest : MonoBehaviour {
    
        [DllImport ("MSDKWrapper")]
        private static extern long getContextNative();
    
        void Start () {
            Debug.Log("Hello, World!");
            long context = getContextNative(); // <-- Exception thrown here
            Debug.Log(context);
            }
    }
    

次の例外が発生します。

system.entrypointnotfoundexception at [0x00000] in Filename unknown:0

コマンドを使用してJavaを使用して同じlibMSDKWrapper.soを使用しました

System.loadLibrary("MSDKWrapper");

getContextNative() メソッドにアクセスして使用することができました。

編集 1: apk の内容を解凍したところ、libMSDKWrapper.so ファイルが test.apk/lib/armeabi-v7a に存在することがわかりました

編集 2: これが logcat ログです。03-25 11:40:17.543: D/dalvikvm(26176): ライブラリを読み込もうとしています /data/data/com.disney.citygirl.goo/lib/libMSDKWrapper.so 0x41566348 03-25 11:40:17.568: D/ MSDK(26176): 登録プロバイダー: SN_COMMUNITY 03-25 11:40:17.568: D/MSDK(26176): 登録プロバイダー: SN_FACEBOOK 03-25 11:40:17.568: D/dalvikvm(26176): 共有ライブラリ /data を追加/data/com.disney.citygirl.goo/lib/libMSDKWrapper.so 0x41566348 03-25 11:40:17.568: I/MSDK(26176): JNI_OnLoad と呼ばれる 03-25 11:40:17.573: D/dalvikvm(26176) : ライブラリを読み込もうとしています /data/data/com.disney.citygirl.goo/lib/libMSDKWrapper.so 0x41566348 03-25 11:40:17.573: D/dalvikvm(26176): 共有ライブラリ '/data/data/com. disney.citygirl.goo/lib/libMSDKWrapper.so' は既に同じ CL にロードされています 0x41566348 03-25 11:40:17.598: I/Unity(26176): System.EntryPointNotFoundException: getContextNative 03-25 11:40:17.598:
03-25 11:40:17.598: I/Unity(26176): (ファイル名: ./Runtime/ExportGenerated/AndroidManaged/UnityEngineDebug.cpp 行: 43)

4

2 に答える 2

2

C++ プラグインを使用していますが、Unity3D のバージョンがサポートしていない可能性がありますか? そのためにはプロが必要だったことを思い出します。

このページは解決策を提供するかもしれません。

于 2013-03-22T14:36:04.893 に答える
0

名前マングリングの問題を回避するために、extern 'c' ディレクティブを使用していることを確認してください。呼び出しを「c」メソッド名で「ラップ」しない場合、C++ コンパイラがメソッド名にアーキテクチャ固有の「ジャンク」を「マングル」または追加するため、この正確な動作が得られます。質問がある場合は、こちらの github プロジェクトを参照してください。

main.cpp (ルートと同じ android-src/ のエントリ ポイント) に注目します。これは、C++ dll をモデル化するために必要なパターンです。このプロジェクトでは、Android 用の C++ DLL をビルドする方法も示します。Ubuntu (およびその他の Debian ライクなオペレーティング システム) と android の両方の完全なビルド手順については、README を参照してください。

@Virtlink私はそれがプロ専用の機能であることを知っていますが、p/invokesを使用するとUnityが警告を出すだけのようです。UnityがV4でそれを修正した場合、私は使用しませんが、V3ではとにかくそれらを使用できます. トライアルも十分でしょう。

別のメモとして、C++ dll を使用する必要がある特定の理由はありますか? ほとんどの場合、必要なことはマネージ C# コードで行うことができます。単一のコードベースとの相互互換性が失われるため、この DLL が必要であることを必ず確認してください。私のdllでは、ユースケースを破棄し、すべてをc#で書き直すことにしました。

于 2013-04-17T21:54:08.667 に答える