CCompileEngine icon indicating copy to clipboard operation
CCompileEngine copied to clipboard

Help

Open moderGamer opened this issue 2 years ago • 7 comments

hello bro me using in code

import android.app.ProgressDialog;
import android.content.pm.PackageManager;
import android.Manifest;
import android.os.Environment;
import android.os.Handler;
import android.widget.Button;
import android.widget.Toast;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import androidx.core.content.ContextCompat;
import androidx.core.app.ActivityCompat;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.xiaoyv.ccompile.compiler.listener.CompileCallback;
import com.xiaoyv.ccompile.compiler.listener.ExecuteListener;
import java.io.File;
import java.util.List;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
	private Button runGcc, runCode;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		runCode = findViewById(R.id.runCode);
		runGcc = findViewById(R.id.runGcc);

		setFiles();
		runCode.setOnClickListener(v -> {
			CompileCpp("/storage/emulated/0/apk/Main.cpp");
			Handler handler = new Handler();
			handler.postDelayed(() -> {
				RunCodes("/storage/emulated/0/apk/");
			}, 3000);

		});
		runGcc.setOnClickListener(c -> {
			installGcc();
		});
	}

	@Override
	public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
		super.onRequestPermissionsResult(requestCode, permissions, grantResults);
		if (requestCode == 1000) {
			setFiles();
		}
	}

	private void getFiles() {
		if (ContextCompat.checkSelfPermission(this,
				Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED
				|| ContextCompat.checkSelfPermission(this,
						Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) {
			ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.READ_EXTERNAL_STORAGE,
					Manifest.permission.WRITE_EXTERNAL_STORAGE }, 1000);
		} else {
			setFiles();
		}
	}

	private void setFiles() {
		new MaterialAlertDialogBuilder(this).setTitle("مجوز فایب").setMessage("مجوز فایب رو بده جاکش")
				.setPositiveButton("ok", (ccc, dd) -> {
					getFiles();
				}).show();
	}

	private void installGcc() {
		ProgressDialog dialogs = new ProgressDialog(MainActivity.this, ProgressDialog.THEME_DEVICE_DEFAULT_DARK);
		dialogs.setTitle("Loading...");
		dialogs.show();
		File dir = new File(Environment.getExternalStorageDirectory() + "/c_compiler/gcc.zip");

		CCppEngine.installGcc(this, new File(Environment.getExternalStorageDirectory() + "/c_compiler/gcc.zip"),
				new CCppEngine.OnInstallListener() {
					@Override
					public void onSuccess() {
						Log.e("aaaa", "安装成功");
						Toast.makeText(MainActivity.this, "Done", Toast.LENGTH_SHORT).show();
						dialogs.dismiss();
					}

					@Override
					public void onError(String error) {
						Toast.makeText(MainActivity.this, error, Toast.LENGTH_SHORT).show();
						dialogs.dismiss();
					}
				});
	}

	private void CompileCpp(String dir) {
		File cFile = new File(dir);
		List<File> files = new ArrayList<>();
		files.add(cFile);

		Log.e("==========", "======================================================================");
		CCppEngine.getCppCompiler().compile(files, new CompileCallback() {
			@Override
			public void onSuccess(String outPath) {
				Log.e("==========", "编译完成:" + outPath);
				Toast.makeText(getApplicationContext(), outPath, 2).show();

			}

			@Override
			public void onError(String error) {
				Log.e("==========", "编译失败:" + error);
				Toast.makeText(getApplicationContext(), error, 2).show();

			}
		});
	}

	private void RunCodes(String dir) {
		File file = new File(dir);

		CCppEngine.getCExecutor().exec(file, new ExecuteListener() {
			@Override
			public void onExecuteStart(Process process) {
				Log.e("开始>>>>>>>", " process start");
			}

			@Override
			public void printStderr(Throwable error) {
				Log.e("错误>>>>>>>", error.toString());
				error.printStackTrace();
				Toast.makeText(getApplicationContext(),error.toString(),2).show();
			}

			@Override
			public void printStdout(CharSequence out) {
				Log.e("输出>>>>>>>", out.toString());
				runCode.setText(out);
			}

			@Override
			public void onExecuteFinish(int waitFor, int exitValue) {
				Log.e("完成>>>>>>>", "====================" + waitFor + "================" + exitValue);
			}
		});
	}

}

This code does not compile the code and does not display anything. Gcc is also installed

moderGamer avatar May 15 '23 22:05 moderGamer

hello bro me using in code

import android.app.ProgressDialog;
import android.content.pm.PackageManager;
import android.Manifest;
import android.os.Environment;
import android.os.Handler;
import android.widget.Button;
import android.widget.Toast;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import androidx.core.content.ContextCompat;
import androidx.core.app.ActivityCompat;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.xiaoyv.ccompile.compiler.listener.CompileCallback;
import com.xiaoyv.ccompile.compiler.listener.ExecuteListener;
import java.io.File;
import java.util.List;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
	private Button runGcc, runCode;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		runCode = findViewById(R.id.runCode);
		runGcc = findViewById(R.id.runGcc);

		setFiles();
		runCode.setOnClickListener(v -> {
			CompileCpp("/storage/emulated/0/apk/Main.cpp");
			Handler handler = new Handler();
			handler.postDelayed(() -> {
				RunCodes("/storage/emulated/0/apk/");
			}, 3000);

		});
		runGcc.setOnClickListener(c -> {
			installGcc();
		});
	}

	@Override
	public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
		super.onRequestPermissionsResult(requestCode, permissions, grantResults);
		if (requestCode == 1000) {
			setFiles();
		}
	}

	private void getFiles() {
		if (ContextCompat.checkSelfPermission(this,
				Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED
				|| ContextCompat.checkSelfPermission(this,
						Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) {
			ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.READ_EXTERNAL_STORAGE,
					Manifest.permission.WRITE_EXTERNAL_STORAGE }, 1000);
		} else {
			setFiles();
		}
	}

	private void setFiles() {
		new MaterialAlertDialogBuilder(this).setTitle("مجوز فایب").setMessage("مجوز فایب رو بده جاکش")
				.setPositiveButton("ok", (ccc, dd) -> {
					getFiles();
				}).show();
	}

	private void installGcc() {
		ProgressDialog dialogs = new ProgressDialog(MainActivity.this, ProgressDialog.THEME_DEVICE_DEFAULT_DARK);
		dialogs.setTitle("Loading...");
		dialogs.show();
		File dir = new File(Environment.getExternalStorageDirectory() + "/c_compiler/gcc.zip");

		CCppEngine.installGcc(this, new File(Environment.getExternalStorageDirectory() + "/c_compiler/gcc.zip"),
				new CCppEngine.OnInstallListener() {
					@Override
					public void onSuccess() {
						Log.e("aaaa", "安装成功");
						Toast.makeText(MainActivity.this, "Done", Toast.LENGTH_SHORT).show();
						dialogs.dismiss();
					}

					@Override
					public void onError(String error) {
						Toast.makeText(MainActivity.this, error, Toast.LENGTH_SHORT).show();
						dialogs.dismiss();
					}
				});
	}

	private void CompileCpp(String dir) {
		File cFile = new File(dir);
		List<File> files = new ArrayList<>();
		files.add(cFile);

		Log.e("==========", "======================================================================");
		CCppEngine.getCppCompiler().compile(files, new CompileCallback() {
			@Override
			public void onSuccess(String outPath) {
				Log.e("==========", "编译完成:" + outPath);
				Toast.makeText(getApplicationContext(), outPath, 2).show();

			}

			@Override
			public void onError(String error) {
				Log.e("==========", "编译失败:" + error);
				Toast.makeText(getApplicationContext(), error, 2).show();

			}
		});
	}

	private void RunCodes(String dir) {
		File file = new File(dir);

		CCppEngine.getCExecutor().exec(file, new ExecuteListener() {
			@Override
			public void onExecuteStart(Process process) {
				Log.e("开始>>>>>>>", " process start");
			}

			@Override
			public void printStderr(Throwable error) {
				Log.e("错误>>>>>>>", error.toString());
				error.printStackTrace();
				Toast.makeText(getApplicationContext(),error.toString(),2).show();
			}

			@Override
			public void printStdout(CharSequence out) {
				Log.e("输出>>>>>>>", out.toString());
				runCode.setText(out);
			}

			@Override
			public void onExecuteFinish(int waitFor, int exitValue) {
				Log.e("完成>>>>>>>", "====================" + waitFor + "================" + exitValue);
			}
		});
	}

}

This code does not compile the code and does not display anything. Gcc is also installed

Android10+ not support exec binary file in data/data/xxxx. You can run the gcc binary file wrap with proot

xiaoyvyv avatar May 16 '23 03:05 xiaoyvyv

hi can you send Code for me?

moderGamer avatar May 16 '23 05:05 moderGamer

I didn't understand, can you help me more or send me a sample code?

@xiaoyvyv

moderGamer avatar May 16 '23 07:05 moderGamer

I didn't understand, can you help me more or send me a sample code?

@xiaoyvyv

There is also a simple method, you can set the targetSdkVersion to less than 30, and then run the demo to test it

xiaoyvyv avatar May 16 '23 09:05 xiaoyvyv

I did it, but I got an empty toast. You should edit your code so that android/data is not needed

moderGamer avatar May 16 '23 10:05 moderGamer

Screenshot_20230516-182129_CppCo

Majdad, Hello, I solved the compilation problem, but when I click on the third button, which is run, it doesn't do anything. I will send you the code I wrote.

package com.xiaoyv.ccompile;

import android.content.Context;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.xiaoyv.ccompile.CCppEngine;
import com.xiaoyv.ccompile.compiler.listener.ExecuteListener;
import android.util.Log;
import java.io.File;

public class Result {
	public static void exe(Context context) {
		StringBuilder builder = new StringBuilder();
		File file = new File("/data/user/0/com.xiaoyv.ccompileengine/files/c_compiler/temp");
		CCppEngine.getCExecutor().exec(file, new ExecuteListener() {
			@Override
			public void onExecuteStart(Process process) {
				Log.e("开始>>>>>>>", " process");
				builder.append("S" + process.toString() + '\n');
			}

			@Override
			public void printStderr(Throwable error) {
				Log.e("错误>>>>>>>", error.toString());
				error.printStackTrace();
			}

			@Override
			public void printStdout(CharSequence out) {
				Log.e("输出>>>>>>>", out.toString());
				builder.append("S" + out +'\n');
                DialogShow(context,builder);
			}

			@Override
			public void onExecuteFinish(int waitFor, int exitValue) {
				Log.e("完成>>>>>>>", "====================" + waitFor + "================" + exitValue);
				builder.append("[Program End]");
				
			}
			
		});
	}
	private static void DialogShow(Context context,StringBuilder b){
		new MaterialAlertDialogBuilder(context).setTitle("Task Result").setMessage(b).setPositiveButton("ok",null).show();
	}

}

moderGamer avatar May 16 '23 14:05 moderGamer

@xiaoyvyv Take it, don't bother yourself, don't bother me, don't bother others, rewrite your code so that it doesn't read anything in Android/data, it can be executed in a public path. I don't think it will take you more than 2 hours

moderGamer avatar May 18 '23 08:05 moderGamer