当前位置: 首页 > 知识库问答 >
问题:

如何在Android应用程序中运行 Java jdt AST

李奕
2023-03-14

我正在Android应用程序中创建一个项目。我已经在java eclipse环境中将java jdt ast作为独立应用程序实现了,并且我在控制台输出上得到了我需要的东西。现在我想把这个代码运行到我的Android应用程序项目中。但是,当我在文本中设置所有输出时,当我启动应用程序时,Android的视图,不幸的是它停止了,我不知道为什么...有人会知道为什么会发生这种情况吗?感谢您的帮助。

package com.example.uiui;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;

import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.Expression;
import org.eclipse.jdt.core.dom.IMethodBinding;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.MethodInvocation;
import org.eclipse.jdt.core.dom.SimpleName;
import org.eclipse.jdt.core.dom.VariableDeclarationFragment;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener{
static TextView tv1;

 private String filename = "MySampleFile.java";
 private static String filepath = "/MyFileStorage";
 File myExternalFile = new File(Environment.getExternalStorageDirectory(),filepath );

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tv1=(TextView)findViewById(R.id.txt1); 
    tv1.setMovementMethod(new ScrollingMovementMethod());

    Button readFromExternalStorage = 
               (Button) findViewById(R.id.getExternalStorage);
              readFromExternalStorage.setOnClickListener(this);

              //check if external storage is available and not read only  
              if (!isExternalStorageAvailable() || isExternalStorageReadOnly()) {  

              } 
              else {
               myExternalFile = new File(getExternalFilesDir(filepath), filename);
              }

}

@Override
public void onClick(View v) {

     // EditText myInputText = (EditText) findViewById(R.id.myInputText);
      TextView responseText = (TextView) findViewById(R.id.responseText);
      String myData = "";
      switch (v.getId()) {
      case R.id.getExternalStorage:
           try {
           FileInputStream fis = new FileInputStream(myExternalFile);
           DataInputStream in = new DataInputStream(fis);
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            String strLine;
            while ((strLine = br.readLine()) != null) {
             myData = myData + strLine;
            }
            in.close();
           } catch (IOException e) {
           e.printStackTrace();
           }
        //   myInputText.setText(myData);
           responseText
           .setText("MySampleFile.txt data retrieved from Internal Storage...");

           parse(myData);

           break;

      }

}



public void parse(String str) {

    ASTParser parser = ASTParser.newParser(AST.JLS3);
    parser.setSource(str.toCharArray());
    parser.setKind(ASTParser.K_COMPILATION_UNIT);
    parser.setResolveBindings(true);

    final CompilationUnit cu = (CompilationUnit) parser.createAST(null);

    cu.accept(new ASTVisitor() {

        Set names = new HashSet();

    public boolean visit(VariableDeclarationFragment node) {
            SimpleName name = node.getName();
            this.names.add(name.getIdentifier());
            tv1.setText(tv1.getText()+"Declaration of '" + name + "' at line"+cu.getLineNumber(name.getStartPosition())+"\n");


            return false; // do not continue 
        }


    public boolean visit(SimpleName node) {
        if (this.names.contains(node.getIdentifier())) {
            tv1.setText(tv1.getText()+"Usage of '" + node + "' at line "+ cu.getLineNumber(node.getStartPosition())+"\n");
        }
        return true;
    }           


public boolean visit(MethodInvocation node) {
System.out.println("Method Name: " + node.getName()+"\n");

 Expression expression = node.getExpression();
      if (expression != null) {
          tv1.setText(tv1.getText()+"Expression: " + expression.toString()+"\n");

                        ITypeBinding typeBinding = expression.resolveTypeBinding();

      if (typeBinding != null) {
          tv1.setText(tv1.getText()+"Type: " + typeBinding.getName());
                        }
                    }
           IMethodBinding binding = node.resolveMethodBinding();
      if (binding != null) {
           ITypeBinding type = binding.getDeclaringClass();
      if (type != null) {
          tv1.setText(tv1.getText()+"Decl: " + type.getName());
                        }
                    }

                    return true;
                }
            });
        }



private static boolean isExternalStorageReadOnly() {  
      String extStorageState = Environment.getExternalStorageState();  
      if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(extStorageState)) {  
       return true;  
      }  
      return false;  
     }  

     private static boolean isExternalStorageAvailable() {  
      String extStorageState = Environment.getExternalStorageState();  
      if (Environment.MEDIA_MOUNTED.equals(extStorageState)) {  
       return true;  
      }  
      return false;  
     }  


}

代码没有显示错误,但应用程序无法工作。。。

现在我想到了另一个问题:我们真的可以将java jdt ast用作android应用程序吗?导入了相同的库,但当它用作java应用程序项目时,代码工作正常。

无论如何,这是来自 logCat 的堆栈跟踪。

09-01 03:38:05.780: E/AndroidRuntime(21566): FATAL EXCEPTION: main
09-01 03:38:05.780: E/AndroidRuntime(21566): java.lang.NoClassDefFoundError:  org.eclipse.jdt.core.dom.ASTParser
09-01 03:38:05.780: E/AndroidRuntime(21566):    at com.example.uiui.MainActivity.parse(MainActivity.java:98)
09-01 03:38:05.780: E/AndroidRuntime(21566):    at com.example.uiui.MainActivity.onClick(MainActivity.java:86)
09-01 03:38:05.780: E/AndroidRuntime(21566):    at android.view.View.performClick(View.java:4475)
09-01 03:38:05.780: E/AndroidRuntime(21566):    at android.view.View$PerformClick.run(View.java:18786)  
09-01 03:38:05.780: E/AndroidRuntime(21566):    at android.os.Handler.handleCallback(Handler.java:730)
09-01 03:38:05.780: E/AndroidRuntime(21566):    at android.os.Handler.dispatchMessage(Handler.java:92)
09-01 03:38:05.780: E/AndroidRuntime(21566):    at android.os.Looper.loop(Looper.java:176)
09-01 03:38:05.780: E/AndroidRuntime(21566):    at android.app.ActivityThread.main(ActivityThread.java:5419)
09-01 03:38:05.780: E/AndroidRuntime(21566):    at java.lang.reflect.Method.invokeNative(Native Method)
09-01 03:38:05.780: E/AndroidRuntime(21566):    at java.lang.reflect.Method.invoke(Method.java:525)
09-01 03:38:05.780: E/AndroidRuntime(21566):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
09-01 03:38:05.780: E/AndroidRuntime(21566):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
09-01 03:38:05.780: E/AndroidRuntime(21566):    at dalvik.system.NativeStart.main(Native Method)

这是我的资源布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.uiui.MainActivity" >
 <TextView
   android:id="@+id/txt1"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_alignParentLeft="true"
   android:layout_alignParentTop="true"
   android:layout_marginLeft="0dp"
   android:layout_marginTop="10dp"
   android:maxLines="200"
   android:scrollbars="vertical"
   android:text="TextView" />

   <Button
   android:id="@+id/getExternalStorage"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_alignLeft="@+id/txt1"
   android:layout_alignParentBottom="true"
   android:layout_marginBottom="18dp"
   android:text="Display from External Storage" />

   <EditText
   android:id="@+id/myInputText"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_above="@+id/getExternalStorage"
   android:layout_alignLeft="@+id/getExternalStorage"
   android:layout_marginBottom="75dp"
   android:ems="10"
   android:gravity="top|left"
   android:inputType="textMultiLine"
   android:lines="5"
   android:minLines="3" >
   <requestFocus />
  </EditText>

   <TextView
   android:id="@+id/responseText"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_alignLeft="@+id/txt1"
   android:layout_below="@+id/txt1"
   android:layout_marginTop="18dp"
   android:maxLines="200"
   android:scrollbars="vertical"
   android:text=" ad"
   android:textAppearance="?android:attr/textAppearanceMedium" />

</RelativeLayout>

最后是manifest.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.uiui"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>

共有1个答案

樊俊悟
2023-03-14

您没有在ParseFilesInDir()中指明崩溃的行。然而,这一行在Android中是完全错误的:

File dirs = new File(".");

因此,首先,您需要决定将文件复制到Android设备的何处。您的Android设备不是您的开发PC,因此该Android设备上没有Java源代码,除非您将其复制到那里。

然后,给定文件的放置位置,您需要调整ParseFilesInDir()以匹配。

文件存放的两个主要选项是内部存储和外部存储。如果要将文件复制到外部存储器,通常将文件复制到设备上会更容易。

 类似资料:
  • 问题内容: 如何通过android app向终端发送命令并获取输出?例如,发送“ ls /”并获取输出以在GUI中将其打印出来? 问题答案: 您必须使用反射来调用android.os.Exec.createSubprocess():

  • 问题内容: 我创建了新的libgdx项目,并且想在Android Studio中运行桌面应用程序。与运行配置有关吗?在Eclipse中,我可以选择“以Java应用程序运行”。 问题答案: 好吧,我做到了。这是解决方案https://github.com/libgdx/libgdx/wiki/Gradle-and-Intellij- IDEA#running-your-project ,单击加号()

  • 问题内容: 嗨,我正在开发一个需要我运行一些bash代码的应用程序,有没有一种方法可以将脚本硬编码到我的应用程序中然后运行它?例如(这是一个非常简化的示例) 我有以下方法来运行一行bash命令,但需要在多行中运行类似的内容。同样,上面的代码是一个非常简化的示例,我实际上在执行的操作必须通过脚本运行,而不能通过Java完成。我也想对它进行硬编码,因为我知道可以将脚本存储在手机上并使用以下命令运行它,

  • 问题内容: 我是一名Android开发人员,我想在我的应用程序中编写一条语句。在此语句中,我要检查默认浏览器(Android OS中 问题答案: 添加下面的Helper类: 现在,你可以从以下代码中检查所需的应用程序是否正在运行:

  • 问题内容: 我正在用Java开发使用Lua脚本的Android游戏。为了执行这些脚本,我将LuaJ与Java的ScriptEngine类一起使用。例如… 但是,Android显然不支持此功能(这与android没有完整的JVM有关,我在某处读过)。有什么方法可以在Android上使用Lua脚本吗?也许有一个LuaJ替代方案?也许有一种直接使用LuaJ编译和执行Lua脚本的方法(尽管我看不到如何)。

  • 问题内容: 我想知道启动Flask应用程序的正确方法。该文档显示了两个不同的命令: 和 产生相同的结果并正确运行该应用程序。 两者之间有什么区别,以及用于运行Flask应用程序的区别是什么? 问题答案: 该命令是用于与Flask应用进行交互的CLI。该文档介绍了如何使用CLI命令和添加自定义命令。该命令是启动开发服务器的首选方法。 使用环境变量将命令指向您的应用程序。设置为与调试器和重新加载器一起