2015-04-23 4 views
1

У меня есть обертка JNI для передачи массивов из Fortran в Java. Теперь я требую, чтобы Java передала этот массив в Python и вернул значение.Java пропускает строки кода

objFuncType.java выглядит следующим образом:

public interface objFuncType { 
    public double calculateobjFunc(double[] pos); 
} 

objFunc.java выглядит следующим образом:

import java.io.*; 
import java.util.*; 
import org.plyjy.factory.JythonObjectFactory; 

public class objFunc { 

public static double evaluate(double[] position) { 
    double result; 
    for (int i=0;i<position.length;i++) 
     System.out.println("position ="+position[i]); 

    JythonObjectFactory factory = JythonObjectFactory.getInstance(); 
    System.out.println("JythonObjectFactory created"); 
    objFuncType func=(objFuncType)factory.createObject(objFuncType.class, "CostCalculator"); 
    result = func.calculateCost(position); 
    System.out.println("Result computed! Result = "+result); 
    return result; 

    } 
} 

CostCalculator.py выглядит следующим образом:

import objFuncType 

class CostCalculator(objFuncType, object): 

def __init__(self): 
    print 'Initializing' 
    pass 

def calculateCost(self, chromosome): 
    fitness = 0 
    for i in range(len(chromosome)-1): 
     fitness += 100*((chromosome[i]**2)-chromosome[i+1])**2+\ 
     (1-chromosome[i])**2 
    return fitness 

Когда я называю Java из внешней программы, выход выглядит следующим образом:

position =1.3653333187103271 
position =0.0 
position =-1.8204443454742432 
position =-1.8204443454742432 

Массив печатается отлично, но все утверждения после инструкции печати пропускаются. Пожалуйста, помогите!

+1

Откуда вы знаете, что они «пропущены»? Вы уверены, что где-то там нет ошибки времени выполнения? – brso05

+0

попробуйте проверить исключение 'try catch' – silentprogrammer

+0

Когда я исключаю часть JNI и переставляю код из метода« оцениваю »на главный метод, он отлично работает. Однако, когда я интегрирую этот код с существующей оболочкой JNI, только первый оператор печати выводит массив. Остальные утверждения игнорируются, и я не вижу вывода для остальных операторов печати. Я не получаю ошибок во время выполнения. –

ответ

0

Хорошо, я понял. Я вызывал Java из C, используя JNI, и похоже, что он не знал, где искать файлы jar. Я добавил следующие строки кода в моей программе на C, которая вызывает Java. Он работает, как ожидалось.

JNIEnv* env; 
JavaVMInitArgs args; 
JavaVMOption options[3]; 
args.version = JNI_VERSION_1_6; 
args.nOptions = 3; 
options[0].optionString = "-Djava.class.path=./"; 
options[1].optionString = "-Djava.class.path=<path_to_class>:<path_to_jars>"; 
options[2].optionString = "-Djava.class.path=<path_to_class>:<path_to_jars>"; 
args.options = options; 
args.ignoreUnrecognized = 0; 
int status; 
status = JNI_CreateJavaVM(jvm, (void**)&env, &args); 
if (status < 0 || !env) 
    printf("Unable to Launch JVM %d\n",rv); 
else 
    printf("Launched JVM successfully\n"); 
return env; 
Смежные вопросы