Android
                 2011/1/17
                      @yusukey




   Copyright(c) Yusuke Yamamoto All rights reserved.
http://samuraism.jp/
                      @yusukey



http://tinyurl.com/android-java
          Copyright(c) Yusuke Yamamoto All rights reserved.
↑
Java Twitter API


  • JDK1.4.2
  • Google App Engine
  • Android
      Copyright(c) Yusuke Yamamoto All rights reserved.
Android Java



      Copyright(c) Yusuke Yamamoto All rights reserved.
Android




    Copyright(c) Yusuke Yamamoto All rights reserved.
new sun.misc.BASE64Encoder().encode(buf);



02-20 18:03:59.843: WARN/dalvikvm(526): VFY: unable to resolve
new-instance 105 (Lsun/misc/BASE64Encoder;) in Ltwitter4j/http/
HttpClient;
02-20 18:03:59.843: WARN/dalvikvm(526): VFY: rejecting opcode
0x22 at 0x0011



              :Android               sun.misc.* / com.sun.*


                   Copyright(c) Yusuke Yamamoto All rights reserved.
• BASE64
  (Commons-Codec                                       ok)


• sun.misc.*                                com.sun.*




           Copyright(c) Yusuke Yamamoto All rights reserved.
XML



 Copyright(c) Yusuke Yamamoto All rights reserved.
XML
   •   Twitter4J
// XML
private String toString(Element doc){
  StringWriter output = new StringWriter();
  Transformer t =
TransformerFactory.newInstance()
   .newTransformer();
  t.transform(new DOMSource(doc),
   new StreamResult(output));
  return output.toString();
}

              Copyright(c) Yusuke Yamamoto All rights reserved.
07-07 23:55:42.993: ERROR/dalvikvm(11182): Could not find method
javax.xml.transform.TransformerFactory.newInstance,
 referenced from method twitter4j.TwitterResponse.toString




                  :Android                  XSLT




                   Copyright(c) Yusuke Yamamoto All rights reserved.
// XML
private static String toString(Element doc){
 StringWriter output = new StringWriter();
 try{
  Transformer t = TransformerFactory
.newInstance().newTransformer();
  t.transform(new DOMSource(doc),
   new StreamResult(output));
  return output.toString();
 }catch(ClassNotFoundException cnfe){
  // javax.xml.transform.TransformerFactory
        // “”
        return “”;
    }
}
                     Copyright(c) Yusuke Yamamoto All rights reserved.
01-16 23:20:58.637: ERROR/AndroidRuntime(209): Uncaught handler: thread main exiting
due to uncaught exception
01-16 23:20:58.668: ERROR/AndroidRuntime(209): java.lang.VerifyError:
com.example.MyActivity
        at java.lang.Class.newInstanceImpl(Native Method)
        at java.lang.Class.newInstance(Class.java:1472)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1097)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2316)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
        at android.app.ActivityThread.access$2100(ActivityThread.java:116)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:123)
        at android.app.ActivityThread.main(ActivityThread.java:4203)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:521)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
(ZygoteInit.java:791)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
        at dalvik.system.NativeStart.main(Native Method)



                     :                                                  VerifyError


                         Copyright(c) Yusuke Yamamoto All rights reserved.
-- // XML
-- private static String toString(Element doc){
-- StringWriter output = new StringWriter();
-- try{
-- Transformer t = TransformerFactory
.newInstance().newTransformer();
-- t.transform(new DOMSource(doc),
-- new StreamResult(output));
-- return output.toString();
-- }catch(ClassNotFoundException cnfe){
-- // javax.xml.transform.TransformerFactory
--   // “”
-- return “”;
-- }
--}


                 Transformer

                    Copyright(c) Yusuke Yamamoto All rights reserved.
XML
String xml = "<title>English &amp;                        </title>";
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance
();
dbf.setCoalescing(true);
dbf.setExpandEntityReferences(true);
ByteArrayInputStream stream = new ByteArrayInputStream(
        xml.getBytes());
DocumentBuilder builder = null;
builder = dbf.newDocumentBuilder();
Document doc = builder.parse(stream);

Node titleNode = doc.getFirstChild();
NodeList children = titleNode.getChildNodes();
System.out.println(children.item(0).getTextContent());




                   Copyright(c) Yusuke Yamamoto All rights reserved.
String xml = "<title>English &amp;                        </title>";
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance
();
dbf.setCoalescing(true);
dbf.setExpandEntityReferences(true);
ByteArrayInputStream stream = new &
                       : “English ByteArrayInputStream(
                                           ”
        xml.getBytes());
DocumentBuilder builder = “English”
                     :     null;
builder = dbf.newDocumentBuilder();
Document doc = builder.parse(stream);

Node titleNode = doc.getFirstChild();
NodeList children = titleNode.getChildNodes();
System.out.println(children.item(0).getTextContent());



                       :XML

                   Copyright(c) Yusuke Yamamoto All rights reserved.
XML




Copyright(c) Yusuke Yamamoto All rights reserved.
• Twitter       xml, JSON, atom, rss

• JSON
 •   JavaScript Object Notation
 •   Web API




               Twitter4J              JSON



               Copyright(c) Yusuke Yamamoto All rights reserved.
JSON



 Copyright(c) Yusuke Yamamoto All rights reserved.
JSON
(“foo”:null, “longvalue”:”13857270119014401”}

JSONObject json = new JSONObject
   ("{"foo":null,"longvalue":"13857270119014401"}");
// true
System.out.println(json.isNull("foo"));
// true

System.out.println(null == json.getString("foo"));
// false
System.out.println("null".equals(json.getString("foo")));
// 13857270119014401
System.out.println(json.getLong("longvalue"));

                 Copyright(c) Yusuke Yamamoto All rights reserved.
JSONObject json = new JSONObject
   ("{"foo":null,"longvalue":"13857270119014401"}");
// true                                            true
System.out.println(json.isNull("foo"));
// true                                            true
System.out.println(null == json.getString("foo"));
// false                                           true
System.out.println("null".equals(json.getString("foo")));
// 13857270119014401                            13857270119014400
System.out.println(json.getLong("longvalue"));


                 :json

                 Copyright(c) Yusuke Yamamoto All rights reserved.
json.org
           twitter4j.internal.org.json.*




           Copyright(c) Yusuke Yamamoto All rights reserved.
•   XSLT                    (Froyo                               )

•                                                     VerifyError

    •   Eclair(Android 2.1)

•   XML

    •   Froyo(Android 2.2)

•   JSON

    •
•   Sun
             Copyright(c) Yusuke Yamamoto All rights reserved.
• Android
public static final boolean IS_DALVIK;
static{
  try {
    // dalvik.system.VMRuntime class should be existing on
Android platform.
    // @see http://developer.android.com/reference/dalvik/
system/VMRuntime.html
      Class.forName("dalvik.system.VMRuntime");
      dalvikDetected = true;
    } catch (ClassNotFoundException cnfe) {
      dalvikDetected = false";
    }
    IS_DALVIK = dalvikDetected;
}
                    Copyright(c) Yusuke Yamamoto All rights reserved.
- Issue 2607 - android -
org.apache.harmony.xml.parsers.DocumentBuilderImpl does not
resolve unicode entity refs
http://code.google.com/p/android/issues/detail?id=2607

- Issue 9244 - android - org.json packages out of date
http://code.google.com/p/android/issues/detail?id=9244

- Issue 13830 - JSONObject.getString() returns "null" string
literal for null value instead of null object.
http://code.google.com/p/android/issues/detail?id=13830

- Issue 13831 - JSONObject.getLong() returns rounded and
inaccurate value
http://code.google.com/p/android/issues/detail?id=13831


                   Copyright(c) Yusuke Yamamoto All rights reserved.

Androidの本当にあった怖い話

  • 1.
    Android 2011/1/17 @yusukey Copyright(c) Yusuke Yamamoto All rights reserved.
  • 2.
    http://samuraism.jp/ @yusukey http://tinyurl.com/android-java Copyright(c) Yusuke Yamamoto All rights reserved.
  • 3.
    ↑ Java Twitter API • JDK1.4.2 • Google App Engine • Android Copyright(c) Yusuke Yamamoto All rights reserved.
  • 4.
    Android Java Copyright(c) Yusuke Yamamoto All rights reserved.
  • 5.
    Android Copyright(c) Yusuke Yamamoto All rights reserved.
  • 6.
    new sun.misc.BASE64Encoder().encode(buf); 02-20 18:03:59.843:WARN/dalvikvm(526): VFY: unable to resolve new-instance 105 (Lsun/misc/BASE64Encoder;) in Ltwitter4j/http/ HttpClient; 02-20 18:03:59.843: WARN/dalvikvm(526): VFY: rejecting opcode 0x22 at 0x0011 :Android sun.misc.* / com.sun.* Copyright(c) Yusuke Yamamoto All rights reserved.
  • 7.
    • BASE64 (Commons-Codec ok) • sun.misc.* com.sun.* Copyright(c) Yusuke Yamamoto All rights reserved.
  • 8.
    XML Copyright(c) YusukeYamamoto All rights reserved.
  • 9.
    XML • Twitter4J // XML private String toString(Element doc){ StringWriter output = new StringWriter(); Transformer t = TransformerFactory.newInstance() .newTransformer(); t.transform(new DOMSource(doc), new StreamResult(output)); return output.toString(); } Copyright(c) Yusuke Yamamoto All rights reserved.
  • 10.
    07-07 23:55:42.993: ERROR/dalvikvm(11182):Could not find method javax.xml.transform.TransformerFactory.newInstance, referenced from method twitter4j.TwitterResponse.toString :Android XSLT Copyright(c) Yusuke Yamamoto All rights reserved.
  • 11.
    // XML private staticString toString(Element doc){ StringWriter output = new StringWriter(); try{ Transformer t = TransformerFactory .newInstance().newTransformer(); t.transform(new DOMSource(doc), new StreamResult(output)); return output.toString(); }catch(ClassNotFoundException cnfe){ // javax.xml.transform.TransformerFactory // “” return “”; } } Copyright(c) Yusuke Yamamoto All rights reserved.
  • 12.
    01-16 23:20:58.637: ERROR/AndroidRuntime(209):Uncaught handler: thread main exiting due to uncaught exception 01-16 23:20:58.668: ERROR/AndroidRuntime(209): java.lang.VerifyError: com.example.MyActivity at java.lang.Class.newInstanceImpl(Native Method) at java.lang.Class.newInstance(Class.java:1472) at android.app.Instrumentation.newActivity(Instrumentation.java:1097) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2316) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417) at android.app.ActivityThread.access$2100(ActivityThread.java:116) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:123) at android.app.ActivityThread.main(ActivityThread.java:4203) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:521) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:791) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549) at dalvik.system.NativeStart.main(Native Method) : VerifyError Copyright(c) Yusuke Yamamoto All rights reserved.
  • 13.
    -- // XML --private static String toString(Element doc){ -- StringWriter output = new StringWriter(); -- try{ -- Transformer t = TransformerFactory .newInstance().newTransformer(); -- t.transform(new DOMSource(doc), -- new StreamResult(output)); -- return output.toString(); -- }catch(ClassNotFoundException cnfe){ -- // javax.xml.transform.TransformerFactory -- // “” -- return “”; -- } --} Transformer Copyright(c) Yusuke Yamamoto All rights reserved.
  • 14.
    XML String xml ="<title>English &amp; </title>"; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance (); dbf.setCoalescing(true); dbf.setExpandEntityReferences(true); ByteArrayInputStream stream = new ByteArrayInputStream( xml.getBytes()); DocumentBuilder builder = null; builder = dbf.newDocumentBuilder(); Document doc = builder.parse(stream); Node titleNode = doc.getFirstChild(); NodeList children = titleNode.getChildNodes(); System.out.println(children.item(0).getTextContent()); Copyright(c) Yusuke Yamamoto All rights reserved.
  • 15.
    String xml ="<title>English &amp; </title>"; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance (); dbf.setCoalescing(true); dbf.setExpandEntityReferences(true); ByteArrayInputStream stream = new & : “English ByteArrayInputStream( ” xml.getBytes()); DocumentBuilder builder = “English” : null; builder = dbf.newDocumentBuilder(); Document doc = builder.parse(stream); Node titleNode = doc.getFirstChild(); NodeList children = titleNode.getChildNodes(); System.out.println(children.item(0).getTextContent()); :XML Copyright(c) Yusuke Yamamoto All rights reserved.
  • 16.
  • 17.
    • Twitter xml, JSON, atom, rss • JSON • JavaScript Object Notation • Web API Twitter4J JSON Copyright(c) Yusuke Yamamoto All rights reserved.
  • 18.
    JSON Copyright(c) YusukeYamamoto All rights reserved.
  • 19.
    JSON (“foo”:null, “longvalue”:”13857270119014401”} JSONObject json= new JSONObject ("{"foo":null,"longvalue":"13857270119014401"}"); // true System.out.println(json.isNull("foo")); // true System.out.println(null == json.getString("foo")); // false System.out.println("null".equals(json.getString("foo"))); // 13857270119014401 System.out.println(json.getLong("longvalue")); Copyright(c) Yusuke Yamamoto All rights reserved.
  • 20.
    JSONObject json =new JSONObject ("{"foo":null,"longvalue":"13857270119014401"}"); // true true System.out.println(json.isNull("foo")); // true true System.out.println(null == json.getString("foo")); // false true System.out.println("null".equals(json.getString("foo"))); // 13857270119014401 13857270119014400 System.out.println(json.getLong("longvalue")); :json Copyright(c) Yusuke Yamamoto All rights reserved.
  • 21.
    json.org twitter4j.internal.org.json.* Copyright(c) Yusuke Yamamoto All rights reserved.
  • 22.
    XSLT (Froyo ) • VerifyError • Eclair(Android 2.1) • XML • Froyo(Android 2.2) • JSON • • Sun Copyright(c) Yusuke Yamamoto All rights reserved.
  • 23.
    • Android public staticfinal boolean IS_DALVIK; static{ try { // dalvik.system.VMRuntime class should be existing on Android platform. // @see http://developer.android.com/reference/dalvik/ system/VMRuntime.html Class.forName("dalvik.system.VMRuntime"); dalvikDetected = true; } catch (ClassNotFoundException cnfe) { dalvikDetected = false"; } IS_DALVIK = dalvikDetected; } Copyright(c) Yusuke Yamamoto All rights reserved.
  • 24.
    - Issue 2607- android - org.apache.harmony.xml.parsers.DocumentBuilderImpl does not resolve unicode entity refs http://code.google.com/p/android/issues/detail?id=2607 - Issue 9244 - android - org.json packages out of date http://code.google.com/p/android/issues/detail?id=9244 - Issue 13830 - JSONObject.getString() returns "null" string literal for null value instead of null object. http://code.google.com/p/android/issues/detail?id=13830 - Issue 13831 - JSONObject.getLong() returns rounded and inaccurate value http://code.google.com/p/android/issues/detail?id=13831 Copyright(c) Yusuke Yamamoto All rights reserved.