BridgeKit を使用してインテントを開始し、Android ギャラリー ピッカーを起動して、選択した画像をバイトとして返します。
インテントは正しく開始され、画像を選択して PNG 表現を取得することもできますが、コールバックを使用してバイトを Obj-C ランドに返そうとすると、次のエラーが発生します。
W/dalvikvm( 3417): No implementation found for native Lmystuff/android/AndroidImageSelector;.imagePicked:([B)V
I/System.out( 3417): java.lang.UnsatisfiedLinkError: Native method not found: mystuff.android.AndroidImageSelector.imagePicked:([B)V
インテントは次のように開始されます。
AndroidIntent* intent = [ [AndroidIntent alloc] initWithContext: [ AndroidActivity currentActivity ] class: [ AndroidImageSelector javaClass ] ];
[intent start];
AndroidImageSelector は JavaObject を拡張し、次のメソッドを含みます。
+ (NSString*) className
{
return @"mystuff.android.AndroidImageSelectorActivity";
}
+ (void) initializeJava
{
[ super initializeJava ];
[AndroidImageSelector registerCallback: @"imagePicked"
selector: @selector( imagePicked:)
returnValue: nil
arguments: [NSData className], nil ];
}
- (void) imagePicked: (NSData*) data
{
NSLog( @"IMAGE PICKED: %d", [ data length ] );
}
Java 側では、AndroidImageSelectorActivity は Activity を拡張し、以下を含みます。
private native void imagePicked( byte[] response );
protected void onActivityResult( int requestCode, int resultCode, Intent imageReturnedIntent )
{
super.onActivityResult( requestCode, resultCode, imageReturnedIntent );
try
{
switch ( requestCode )
{
case SELECT_PHOTO:
if ( resultCode == RESULT_OK )
{
Uri selectedImage = imageReturnedIntent.getData();
Bitmap bitmap = decodeURI( selectedImage );
ByteArrayOutputStream out0 = new ByteArrayOutputStream();
bitmap.compress( Bitmap.CompressFormat.PNG, 100, out0 );
byte[] pngBytes = out0.toByteArray();
imagePicked( pngBytes );
}
}
protected void onCreate( Bundle savedInstanceState )
{
super.onCreate( savedInstanceState );
Intent photoPickerIntent = new Intent( Intent.ACTION_PICK );
photoPickerIntent.setType( "image/*" );
startActivityForResult( photoPickerIntent, SELECT_PHOTO );
}