如何在Android应用程序中运行javajdtast
我正在android应用程序中创建一个项目。我已经在JavaEclipse环境中将JavaJDT ast作为独立应用程序实现,并且在控制台输出中获得了所需的内容。现在我想在我的android应用程序项目中运行这些代码。但当我启动应用程序时在android的textView中设置所有输出时,不幸的是它停止了,我不知道为什么。。。 有人知道为什么会这样吗? 谢谢你的帮助如何在Android应用程序中运行javajdtast,java,android,eclipse,abstract-syntax-tree,eclipse-jdt,Java,Android,Eclipse,Abstract Syntax Tree,Eclipse Jdt,我正在android应用程序中创建一个项目。我已经在JavaEclipse环境中将JavaJDT ast作为独立应用程序实现,并且在控制台输出中获得了所需的内容。现在我想在我的android应用程序项目中运行这些代码。但当我启动应用程序时在android的textView中设置所有输出时,不幸的是它停止了,我不知道为什么。。。 有人知道为什么会这样吗? 谢谢你的帮助 package com.example.uiui; import java.io.BufferedReader; import
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;
}
}
代码没有显示错误,但应用程序不工作
现在我想到了另一个问题:我们真的可以使用JavaJDTAST作为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>
您没有指明要崩溃的是
ParseFilesInDir()
中的哪一行。然而,这句话在Android中是完全错误的:
File dirs = new File(".");
因此,首先,您需要决定将文件复制到Android设备上的位置。您的Android设备不是您的开发PC,因此该Android设备上没有Java源代码,除非您将其复制到那里
然后,考虑到文件放在哪里,需要调整ParseFilesInDir()
以匹配
放置文件的两个主要选项是和。如果要将文件复制到外部存储器,通常会更容易将文件复制到设备上。使用LogCat检查与崩溃相关的Java堆栈跟踪:我已检查了LogCat并编辑了问题。如何解决这些日志cat问题。我也编辑并提供了其他文件。请检查问题出在哪里。?假设我将文件复制到android设备的外部存储上。那么如何从ParseFilesInDir()访问外部存储?@AdnanQureshi:这取决于您将文件放在外部存储的哪个位置。请参阅中的“存储外部存储的多条路径”。我查看了这些链接,对存储有了更多的了解。如果我将java代码复制到某个自定义文件夹(如abc)的external/sdCard dir中。其中包含所需文件,那么我应该如何在parseFilesDir()中配置代码,以便从外部某个静态文件夹读取该文件?@AdnanQureshi:将为您提供外部存储的根目录。从那里,创建一个
文件
对象,指向放置文件的相对路径(例如,新文件(Environment.getExternalStorageDirectory(),“your/files/go/in/here”)
。@AdnanQureshi您到底是如何包含JAR的?安卓抱怨说他们不在那里。发布一个新问题也是有意义的。这个问题得到了回答。