9

私は Android プラットフォームのネイティブ拡張に取り組んでいますが、行き詰まりました...

Android 2.1 をターゲットにしています... Google Nexus One (2.3.6) でテスト中

この行は NULL を返します

this.context = ExtensionContext.createExtensionContext("com.company.ane.LocationManager", "");

これは拡張記述子ファイルです。

<extension xmlns="http://ns.adobe.com/air/extension/3.1">
<id>com.company.ane.LocationManager</id>
<versionNumber>0.0.1</versionNumber>
<platforms>
<platform name="iPhone-ARM">
  <applicationDeployment>
    <nativeLibrary>libANELocationManager.a</nativeLibrary>
    <initializer>ExtInitializer</initializer>
    <finalizer>ExtFinalizer</finalizer>
  </applicationDeployment>
</platform>
<platform name="Android-ARM">
<applicationDeployment>         
   <nativeLibrary>libANELocationManager.jar</nativeLibrary>
     <initializer>com.company.ane.android.ANELocationManager</initializer>
</applicationDeployment> 
       </platform></platforms></extension>

それが私のパッケージコマンドです:

adt -package -target ane ./../../app/libs/locationmanager.ane ./../extension.xml -swc ane_location_manager.swc -platform iPhone-ARM library.swf libANELocationManager.a -platform Android-ARM library.swf libANELocationManager.jar

この段階での拡張は非常に単純です...文字列値をアプリに戻そうとしています...

package com.company.ane.android;

import java.util.HashMap;
import java.util.Map;

import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;

import android.location.LocationListener;
import android.location.LocationManager;

public class ANELocationManagerContext extends FREContext {

public LocationManager locationManager;
public LocationListener locationListener;

@Override
public void dispose() {
    // TODO Auto-generated method stub

}

@Override
public Map<String, FREFunction> getFunctions() {

    Map<String, FREFunction> functionMap = new HashMap<String, FREFunction>();

    functionMap.put("ExtensionTest", new ExtensionTest());

    return functionMap;
}

    }


 package com.company.ane.android;

import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
import com.adobe.fre.FREObject;
import com.adobe.fre.FREWrongThreadException;

public class ExtensionTest implements FREFunction {

@Override
public FREObject call(FREContext context, FREObject[] args) {

    FREObject result = null;
    //ANELocationManagerContext ctx = (ANELocationManagerContext) context;


    try 
    {
        result  = FREObject.newObject("It works!");  

    }
    catch (FREWrongThreadException fwte)
    {
        fwte.printStackTrace();
    }

    return result;
}

 }


package com.company.ane.android;

import com.adobe.fre.FREContext;
import com.adobe.fre.FREExtension;

public class ANELocationManager implements FREExtension {

@Override
public FREContext createContext(String contextType) {

    return new ANELocationManagerContext();
}

@Override
public void dispose() {
    // TODO Auto-generated method stub

}

@Override
public void initialize() {
    // TODO Auto-generated method stub

}

}
4

5 に答える 5

7

まったく同じ問題がありました。私のANEは、デフォルトのライブラリが使用されているiOS、シミュレーターで正常に動作していましたが、実際のAndroidデバイス(Android-ARMプラットフォーム)では動作していませんでした。

そしてExtensionContext.createExtensionContext()戻ってきnullた。

この問題は、ツールのバージョンの問題、Java コンパイラのバージョンであることが判明しました。最新の AIR (3.8)、JDK (1.7.25)、Android SDK (22.0.5) などを使用していましたが、動作しませんでした。

しかし、呼び出しに追加-target 1.6した後javac、うまくいきました。

于 2013-08-02T19:56:10.333 に答える
3

最も基本的な拡張機能には、まだ 2 つのクラスが含まれています。

FREExtension インターフェイスを実装する必要があります。

package com.your.package;

import com.adobe.fre.FREContext;
import com.adobe.fre.FREExtension;

public class YourExtension implements FREExtension 
{
public static FREContext context;

@Override
public FREContext createContext(String contextType) 
{
    return context = new YourContext();
}

@Override
public void dispose() 
{
    context = null;
}

@Override
public void initialize() 
{
}
}

そして、コンテキストは上記のクラスです:

package com.your.package;

import java.util.HashMap;
import java.util.Map;

import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;

public class YourContext extends FREContext 
{
@Override
public void dispose() 
{
}

@Override
public Map<String, FREFunction> getFunctions() 
{
    Map<String, FREFunction> functionMap = new HashMap<String, FREFunction>();
    // Create your map      
    return functionMap;
}
}

拡張 xml のクラスは、ここでは最初のクラス、つまり FREExtension の実装でなければなりません。

また、この拡張機能の iPhone バージョンを作成する場合を除き、extension.xml から iPhone ノードを削除する必要があります。

于 2012-01-24T22:14:37.343 に答える
1

NULL 参照はどこで取得していますか? これはデバイス上で実行されていますか?それとも AIR シミュレーターで実行されていますか?

実行している現在のプラットフォーム (Windows シミュレーターなど) で ExtensionContext が見つからない場合、デバイス上で正常に動作する場合でも、NULL が返されます。特定の一致が見つからない場合に使用される ANE をコンパイルするときに、デフォルトのコンテキストをセットアップできます。このデフォルト ターゲットは完全に AS3 で記述でき、サポートされていないデバイスの偽造や処理に役立ちます。

デフォルトの実装を含める方法については、Adobe AIR のドキュメントに詳細が記載されています。こちらをご覧ください: http://help.adobe.com/en_US/air/extensions/WSf268776665d7970d-2482335412ffea65006-8000.html

編集:おっと、デバイスで実行されているようです。私はまだデフォルトのものを試して、それが機能するかどうかを確認します.それは問題を絞り込むのに役立つかもしれません.

編集 2: FREExtension インターフェースを (Java で) 実装していますか? 投稿されたコードにはそれがありません。

于 2012-01-23T22:11:15.893 に答える