Следуя разделу «ТРУБА СО СТРУНКАМИ» этого руководства: http://www.jonathanbeard.io/tutorials/CtoJava
Я хочу изменить код StreamTest, чтобы сохранить данные в переменной и передать их другому классу.
Я пробовал это сделать (см. Ниже), но когда я запустил java -cp. StreamTest из учебника я получаю следующее:
Основной метод не найден в классе StreamTest, определите основной метод как: public static void main (String [] args)
Думаю, в этом есть смысл, но сейчас я не знаю, как к этому подойти.
Основная идея заключается в том, что я хочу иметь возможность получать данные из кода c, помещать их в проход переменной (я думаю, через код StreamTest), а затем передавать эту переменную в мой класс mainLaptop
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
public class StreamTest
{
private static final int buffer = 4096;
public static String main(String [] args, String pass)
{
InputStream is = null;
BufferedInputStream bis = null;
try
{
bis = new BufferedInputStream(System.in,buffer);
StringBuilder sb = new StringBuilder();
sb.append((char)bis.read());
while(bis.available() > 0)
{
sb.append((char)bis.read());
}
System.out.println("JAVA SIDE: "+sb.toString());
pass=sb.toString();
bis.close();
}
catch(IOException ex){}
finally{}
//return pass;
return pass;
}
}
Вот основной класс, в который я хочу передать данные
public class mainLaptop
{
public static void main(String arg) throws Exception
{
//Timing out? change the IP!
String ip = "192.168.137.127";
String Pi1Q1 = "Leonardo";
String Pi1Q2 = "Raphael";
String Pi2Q3 = "Donatello";
String Pi2Q4 = "Michelangelo";
String pass=arg;
//pass= StreamTest.main(pass);
Send.send(ip, Pi1Q1, pass);
Send.send(ip, Pi1Q2, pass);
Send.send(ip, Pi2Q3, pass);
Send.send(ip, Pi2Q4, pass);
/* Recv.recv(ip, Pi1Q1);
Recv.recv(ip, Pi1Q2);
Recv.recv(ip, Pi2Q3);
Recv.recv(ip, Pi2Q4);*/
}
}
Вот немодифицированный StreamTest, который работает
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
public class StreamTest
{
private static final int buffer = 4096;
public static void main(String[] args) throws Exception
{
String pass=null;
InputStream is = null;
BufferedInputStream bis = null;
try
{
bis = new BufferedInputStream(System.in,buffer);
StringBuilder sb = new StringBuilder();
//sb.append((char)bis.read());
while(bis.available() > 0){
sb.append((char)bis.read());
}
pass = sb.toString();
System.out.println("JAVA SIDE: "+sb.toString());
bis.close();
}
catch(IOException ex)
{
}
finally
{
}
// mainLaptop.main(pass);
}
Вот код c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <inttypes.h>
#define DEBUG 0
#define BUFFER 4096
//open ap.txt for text input
static const char* exFile = "ap.txt";
static char inputBuffer[BUFFER];
int main(int argc, const char** argv)
{
FILE *fp = fopen(exFile,"r");
/*check and see if the pointer is null in otherwords see if the memory
location refered to by fp is set...no memory location should be zero
if you want to reference it
Here are some good ways to do this other than the way I did it below:
if (!fp) {do error}
if (fp == NULL) {do error}
and then there's the way I did it below
*/
if (fp == 0){
fprintf(stderr,"Null pointer exception, check file name.\n");
exit(-1);
}
//check and see if an error occured during open
const int err = ferror(fp);
if (err != 0){
/*
void perror(const char* err)
returns specific error message to string attached.
*/
const char* errMessage = strcat("Something bad happened while opening
file ",exFile);
perror(errMessage);
}
#if (DEBUG == 1)
else
{
fprintf(stderr,"Success opening file!!\n");
}
#endif
setbuf(fp,inputBuffer); //set a buffer for input
uint64_t *num = (uint64_t*) malloc(sizeof(uint64_t));
uint64_t total = 0;
uint64_t n = 0;
//test for eof
/*
feof(*fp) - returns a boolean true if at end of file and false otherwise
*/
while(!feof(fp)){
//fscanf returns the number of items it converted using %llu, if it's not
equal to 1 we don't want to continue
if (fscanf(fp,"%"PRIu64"",num)!=1)
break; //you could do a lot of stuff here as far as error handling but
basically something bad has happened
total+= *num; //add to total the value at memory location num
n++;
#if (DEBUG == 1)
fprintf(stderr,"line number %"PRIu64"\n",n);
#endif
}
free(num);
const double average = (double) total / (double) n;
//close the inputfile
fclose(fp);
//declare our outputfile, use a pipe in this case to a java process
//we open a java process for this process to pipe to, also it is
//technically a bi-directional pipe so we can use any of the modifiers
//like r/w/r+/etc
static const char* outFile = "java -cp . StreamTest";
FILE *fp_out = popen(outFile,"w");
//setbuf(fp_out,outputBuffer);
fprintf(fp_out,"Total: %"PRIu64", Integers: %"PRIu64", Average:
%.4f\n",total,n,average);
/*
int fflush(*fp) pushes any data in the buffer to be written
the return value returns 0 if successful or !=0 if an error
occurs....remember return values in C often equal exceptions
*/
fflush(fp_out);
/*
int
*/
fclose(fp_out);
return 1;
}
Вот файл make
CC ?=gcc
JCC ?= javac
FLAGS ?= -Wall -O2
JFLAGS ?= -g -verbose
all: c_app StreamTest
c_app: c_app.c
$(CC) $(FLAGS) -o c_app c_app.c
StreamTest: StreamTest.java
$(JCC) $(JFLAGS) StreamTest.java $(LIBS)
clean:
rm -f c_app StreamTest.class
Файл ap.text - это просто набор чисел
Я обновил свой код StreamTest и запустил его через eclipse, но мой результат
JAVA SIDE:
[x] Sent ''Leonardo
[x] Sent ''Raphael
[x] Sent ''Donatello
[x] Sent ''Michelangelo
вместо
JAVA SIDE:
[x] Sent 'Total: 4953, Integers: 1000, Average: 4.9530'Leonardo
[x] Sent 'Total: 4953, Integers: 1000, Average: 4.9530'Raphael
[x] Sent 'Total: 4953, Integers: 1000, Average: 4.9530'Donatello
[x] Sent 'Total: 4953, Integers: 1000, Average: 4.9530'Michelangelo
Обновленный StreamTest
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
public class StreamTest
{
private static final int buffer = 4096;
public static void main(String[] args) throws Exception
{
String pass=null;
InputStream is = null;
BufferedInputStream bis = null;
try
{
bis = new BufferedInputStream(System.in,buffer);
StringBuilder sb = new StringBuilder();
//sb.append((char)bis.read());
while(bis.available() > 0){
sb.append((char)bis.read());
}
pass = sb.toString();
System.out.println("JAVA SIDE: "+pass);
bis.close();
}
catch(IOException ex)
{
}
finally
{
}
//pass = "hi";
mainLaptop.main(pass);
}
}
Я вызываю класс StreamTest для другого своего класса следующим образом: String pass = null; пройти = StreamTest.main (аргумент, пройти); Но перед запуском этого класса / приложения мне нужно запустить StreamTest с терминала следующим образом: 1 make StreamTest 2 make c_app 3 java -cp. StreamTest 4 ./c_app, но опять же проблема на шаге 3. Я получаю сообщение об ошибке выше (в моем сообщении), потому что вместо этого: public static void main (String [] args) У меня это как public static String
Я думаю, у вас тут проблема с дизайном. Возможно, вам поможет публикация ваших полных требований. Как есть, это проблема XY. Вы делаете что-то нелогичное, но, возможно, этого требуют ваши требования - мы не сможем узнать, пока вы не опишете
Я думал запустить эти команды: 1 make StreamTest 2 make c_app 3 java -cp. StreamTest 4 ./c_app в терминале, чем компиляция и запуск mainLaptop в eclipse, но, возможно, это неправильный способ сделать это
Но основная идея заключается в том, что я хочу иметь возможность получать данные из кода c, помещать их в проход переменной, а затем передавать эту переменную в мой класс mainLaptop.
Классы не возвращают методы, а классы не являются точками входа. Классы имеют методы, а методы могут возвращать строки или быть точками входа ('public static void main (String [] args)').
Я обновил свой код, поэтому вызываю mainLaptop в StreamTest, но не получаю желаемого результата. Какие-либо предложения?




Вы все неправильно поняли ... вы бежите
java -cp
Итак, это пытается запустить ваше приложение, отсюда и ошибка, заключающаяся в том, что он не может найти метод Main, потому что Java ищет метод Main при попытке запустить приложение ...
Если вы хотите сохранить данные, просто передайте данные в команду следующим образом
java -cp . class "the string you want"
И затем в основном методе у вас есть "String args []", читающий это из этого :)
РЕДАКТИРОВАТЬ
@Jas Buddy, что ты делаешь ??? как у вас может быть два основных метода ....? scrap StreamTest используйте только mainLaptop ....
public class mainLaptop
{
public static void main(String arg) throws Exception
{
//Timing out? change the IP!
String ip = "192.168.137.127";
String Pi1Q1 = "Leonardo";
String Pi1Q2 = "Raphael";
String Pi2Q3 = "Donatello";
String Pi2Q4 = "Michelangelo";
String pass=arg[0]; // reads the argument you pass from command line or eclipse
//pass= StreamTest.main(pass);
Send.send(ip, Pi1Q1, pass);
Send.send(ip, Pi1Q2, pass);
Send.send(ip, Pi2Q3, pass);
Send.send(ip, Pi2Q4, pass);
/* Recv.recv(ip, Pi1Q1);
Recv.recv(ip, Pi1Q2);
Recv.recv(ip, Pi2Q3);
Recv.recv(ip, Pi2Q4);*/
}
}
ЕСЛИ вы запускаете его из затмения
Щелкните правой кнопкой мыши "Выполнить" -> "Выполнить конфигурацию" -> "Аргументы".

Вывод будет «подростковый мутант», потому что мы взяли только args [0], если вам нужны другие значения, тогда arg1, args2 ...
если вы хотите запустить его в commandLine, тогда

Хорошо, поэтому, если я хочу поместить данные в свой класс mainLaptop (я добавил его выше), все, что мне нужно сделать, это java -cp. mainLaptop "пройти"?
@Jas в значительной степени да ... попробуйте без кавычек вроде "java -cp. MainLaptop pass", и вы сможете получить это в своем основном методе, используя args [0]
Я получаю сообщение об ошибке: не удалось найти или загрузить основной класс mainLaptop, хотя я изменил код c, чтобы использовать mainLaptop вместо StreamTest
это проблема пути к классу, вы внутри пакета ??
Я могу отправить вам экспорт моего проекта. У меня есть классы / файлы StreamTest, mainLaptop и Send в пакете src. Я обновил свой пост, указав, как теперь выглядит мой класс StreamTest, но данные не передаются в мою переменную pass, когда я запускаю StreamTest в eclipse
main()- это точка входа - если другой класс является частью того же приложения Java, вы можете вызвать его метод из main, передав имеющуюся строку.