git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9924 75d07b2b-3a1a-0410-a2c5-0572b91ccdca3.0
parent
2aae8d72a6
commit
7bb5e9bfdd
@ -1,107 +0,0 @@ |
|||||||
#include <jni.h> |
|
||||||
#import <UIKit/UIKit.h> |
|
||||||
|
|
||||||
|
|
||||||
#define JNIEXPORT __attribute__ ((visibility("default"))) \ |
|
||||||
__attribute__ ((used)) |
|
||||||
|
|
||||||
BOOL checkJNIException(JNIEnv *e){ |
|
||||||
if ((*e)->ExceptionCheck(e)) { |
|
||||||
(*e)->ExceptionDescribe(e); |
|
||||||
(*e)->ExceptionClear(e); |
|
||||||
return YES; |
|
||||||
} |
|
||||||
return NO; |
|
||||||
} |
|
||||||
|
|
||||||
#ifndef _Included_com_jme3_system_ios_IosImageLoader |
|
||||||
#define _Included_com_jme3_system_ios_IosImageLoader |
|
||||||
#endif |
|
||||||
|
|
||||||
JNIEXPORT jobject JNICALL |
|
||||||
Java_com_jme3_system_ios_IosImageLoader_loadImageData(JNIEnv* e, jclass obj, jobject imageFormat, jobject inputStream){ |
|
||||||
// prepare java classes and method pointers |
|
||||||
jclass imageClass = (*e)->FindClass(e, "com.jme3.texture.Image"); |
|
||||||
jclass inputStreamClass = (*e)->FindClass(e, "java.io.InputStream"); |
|
||||||
jclass bufferUtilsClass = (*e)->FindClass(e, "com.jme3.util.BufferUtils"); |
|
||||||
jmethodID imageConstructor = (*e)->GetMethodID(e, imageClass, "<init>", "(Lcom/jme3/texture/Image$Format;IILjava/nio/ByteBuffer;)V"); |
|
||||||
jmethodID readMethod = (*e)->GetMethodID(e, inputStreamClass, "read", "([B)I"); |
|
||||||
jmethodID newBufferMethod = (*e)->GetStaticMethodID(e, bufferUtilsClass, "createByteBuffer", "(I)Ljava/nio/ByteBuffer;"); |
|
||||||
if (checkJNIException(e)) { |
|
||||||
return nil; |
|
||||||
} |
|
||||||
// read data from inputstream via byteArray to NSMutableData |
|
||||||
jbyteArray tempArray = (*e)->NewByteArray (e, 1000); |
|
||||||
NSMutableData *inData = [[NSMutableData alloc] init]; |
|
||||||
jint size = (*e)->CallIntMethod(e, inputStream, readMethod, tempArray); |
|
||||||
if (checkJNIException(e)) { |
|
||||||
[inData release]; |
|
||||||
return nil; |
|
||||||
} |
|
||||||
while (size != -1) { |
|
||||||
jbyte *data; |
|
||||||
data = (*e)->GetByteArrayElements(e, tempArray, false); |
|
||||||
[inData appendBytes:data length:size]; |
|
||||||
(*e)->ReleaseByteArrayElements(e, tempArray, data, JNI_ABORT); |
|
||||||
size = (*e)->CallIntMethod(e, inputStream, readMethod, tempArray); |
|
||||||
if (checkJNIException(e)) { |
|
||||||
[inData release]; |
|
||||||
return nil; |
|
||||||
} |
|
||||||
} |
|
||||||
(*e)->DeleteLocalRef(e, tempArray); |
|
||||||
if (checkJNIException(e)) { |
|
||||||
[inData release]; |
|
||||||
return nil; |
|
||||||
} |
|
||||||
// decode image data |
|
||||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; |
|
||||||
UIImage* inputImage = [UIImage imageWithData:inData]; |
|
||||||
if(inputImage == nil){ |
|
||||||
[inData release]; |
|
||||||
[pool release]; |
|
||||||
return nil; |
|
||||||
} |
|
||||||
CGImageRef inImage = [inputImage CGImage]; |
|
||||||
int ht = CGImageGetWidth(inImage); |
|
||||||
int wdth = CGImageGetHeight(inImage); |
|
||||||
// NewDirectByteBuffer seems to fail? -> Creating ByteBuffer in java |
|
||||||
jobject nativeBuffer = (*e)->CallStaticObjectMethod(e, bufferUtilsClass, newBufferMethod, ht*wdth*4); |
|
||||||
if (checkJNIException(e)) { |
|
||||||
[inData release]; |
|
||||||
[pool release]; |
|
||||||
return nil; |
|
||||||
} |
|
||||||
void *rawData = (*e)->GetDirectBufferAddress(e, nativeBuffer); |
|
||||||
NSUInteger bytesPerRowImg = CGImageGetBytesPerRow(inImage); |
|
||||||
NSUInteger bitsPerComponentImg = CGImageGetBitsPerComponent(inImage); |
|
||||||
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); |
|
||||||
CGContextRef context = CGBitmapContextCreate(rawData,ht,wdth,bitsPerComponentImg,bytesPerRowImg,colorSpace,kCGImageAlphaPremultipliedLast| kCGBitmapByteOrder32Big); |
|
||||||
CGColorSpaceRelease(colorSpace); |
|
||||||
CGContextDrawImage(context,CGRectMake(0,0,wdth,ht), inImage); |
|
||||||
CGContextRelease(context); |
|
||||||
[inData release]; |
|
||||||
[pool release]; |
|
||||||
//create image |
|
||||||
jobject imageObject = (*e)->NewObject(e, imageClass, imageConstructor, imageFormat, wdth, ht, nativeBuffer); |
|
||||||
return imageObject; |
|
||||||
} |
|
||||||
|
|
||||||
#ifndef _Included_com_jme3_system_ios_JmeIosSystem |
|
||||||
#define _Included_com_jme3_system_ios_JmeIosSystem |
|
||||||
#endif |
|
||||||
|
|
||||||
JNIEXPORT void JNICALL |
|
||||||
Java_com_jme3_system_ios_JmeIosSystem_showDialog(JNIEnv* e, jobject c, jstring text) { |
|
||||||
const char* chars = (*e)->GetStringUTFChars(e, text, 0); |
|
||||||
NSString* string = [[NSString alloc] initWithUTF8String : chars]; |
|
||||||
(*e)->ReleaseStringUTFChars(e, text, chars); |
|
||||||
UIAlertView *alert = [[UIAlertView alloc] initWithTitle : @"Error" |
|
||||||
message : string |
|
||||||
delegate : nil |
|
||||||
cancelButtonTitle : @"OK" |
|
||||||
otherButtonTitles : nil]; |
|
||||||
[alert show]; |
|
||||||
[alert release]; |
|
||||||
[string release]; |
|
||||||
} |
|
Loading…
Reference in new issue