JNI ile OpenMS kütüphanesini Java'da kullanmak..

Başlatan voqka35, 21 Nisan 2014 - 14:27:52

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

voqka35

Merhaba arkadaşlar,
Başlıkta yazdığım gibi bu proje üzerinde çalışmaktayım. Şuan sadece ufak bir örnek yapmak için, Netbeans'te .cpp dosyasına OpenMS header dosyalarını include edebildim. Fakat Main.java çalıştırdığımda  şu hatayı alıyorum,

"Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/mert/NetBeansProjects/JNIDemoCdl/dist/libJNIDemoCdl.so: /home/mert/NetBeansProjects/JNIDemoCdl/dist/libJNIDemoCdl.so: undefined symbol: _ZTIN11xercesc_3_117SAXParseExceptionE"

Ekteki resimde görüldüğü gibi bazı header dosyalarını include etmeyince  bu hatayı almıyorum fakat oradaki 4 tane header dosyasında da aynı hatayı alıyorum.

JNI hakkında tecrübeli olan arkadaşlara proje dosyalarını gönderebilirim ya da daha detaylı anlatım isterseniz açıklayabilirim.


Şimdiden herkese teşekkürler,iyi çalışmalar.
   

[eklenti yönetici tarafından silindi]

sem

Merhabalar,

Siz doğrudan main metodunu çağırmışsınız sanırım,

Java kodunu da geçebilir misiniz buray? Bu JNI'ı java'ya nasıl tanıtıyorsunuz ve Java'daki Main metodunu hangi yöntem ile çağırıyorsunuz? Büyük ihtimal tek bir .java dosyanız vardır, buraya geçebilir misiniz dosyayı, kod etiketi içerisinde....
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

voqka35

Merhaba sem,

İlgin için sağol, istediklerini yazıyorum,ekte proje dosyalarımın kaç tane ve neler oldukları var,içeriklerini de istediğin şekilde ekliyorum.

JNIDemoJava.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jnidemojava_Main */

#ifndef _Included_jnidemojava_Main
#define _Included_jnidemojava_Main
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     jnidemojava_Main
* Method:    nativePrint
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_jnidemojava_Main_nativePrint
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif


JNIDemo.cpp

#include <jni.h>
#include <stdio.h>
#include "JNIDemoJava.h"


#include <OpenMS/config.h>
#include <OpenMS/FORMAT/EDTAFile.h>
//#include <OpenMS/FORMAT/FileHandler.h>
//#include <OpenMS/FORMAT/FileTypes.h>
//#include <OpenMS/FORMAT/FeatureXMLFile.h>
//#include <OpenMS/FORMAT/ConsensusXMLFile.h>
#include <OpenMS/FORMAT/IBSpectraFile.h>
#include <OpenMS/DATASTRUCTURES/StringListUtils.h>
#include <OpenMS/APPLICATIONS/TOPPBase.h>
#include <OpenMS/KERNEL/ConversionHelper.h>
using namespace OpenMS;
using namespace std;





JNIEXPORT void JNICALL Java_jnidemojava_Main_nativePrint
        (JNIEnv *env, jobject obj)
{



    printf("\nHello World from C++\n");
   



   

}



Main.java

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

package jnidemojava;

/**
*
* @author mert
*/
public class Main {

    static {
    System.load("/home/mert/NetBeansProjects/JNIDemoCdl/dist/libJNIDemoCdl.so");
       }
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
      new Main().nativePrint();
    }

    private native void nativePrint() ;
   
}






Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 22 Nisan 2014 - 14:52:54

Ek olarak c++ compiler ayarlarım ve directories and headers ayarlarım ekteki şekilde.



[eklenti yönetici tarafından silindi]

voqka35

Bu sorunumu linker->addionatial options-> -lxerces-c komutunu ekleyerek çözdüm fakat bu sefer de hatasız build etmesine rağmen, main.java içinde, cpp kodlarımdaki class çalışmıyor, main.java da bu classı nasıl çağırabilirim ya da çalışmasını sağlayabilirim ?


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 29 Nisan 2014 - 14:18:36

.cpp kodlarım aşağıdaki gibi
#include <jni.h>
#include <stdio.h>
#include "JNIDemoJava.h"

#include <OpenMS/FORMAT/MzMLFile.h>
#include <OpenMS/KERNEL/StandardTypes.h>
#include <OpenMS/APPLICATIONS/TOPPBase.h>
#include <OpenMS/FORMAT/FileHandler.h>
#include <OpenMS/FILTERING/TRANSFORMERS/SpectraMerger.h>

#include <algorithm>
using namespace OpenMS;
using namespace std;
 




JNIEXPORT void JNICALL Java_jnidemojava_Main_nativePrint
        (JNIEnv *env, jobject obj)
{
    

    class TOPPSpectraMerger :
  public TOPPBase
{
public:
  TOPPSpectraMerger() :
    TOPPBase("SpectraMerger", "Merges spectra (each MS level separately), increasing S/N ratios.")
  {

  }

protected:
  void registerOptionsAndFlags_()
  {
    
    registerInputFile_("in", "<file>", "", "Input mzML file.");
    setValidFormats_("in", ListUtils::create<String>("mzML"));
    registerOutputFile_("out", "<file>", "", "Output mzML file with merged spectra.");
    setValidFormats_("out", ListUtils::create<String>("mzML"));

    registerStringOption_("merging_method", "<method>", "block_method", "Method of merging which should be used.", false);
    setValidStrings_("merging_method", ListUtils::create<String>("precursor_method,block_method"));

    registerSubsection_("algorithm", "Algorithm section for merging spectra");
  }

  Param getSubsectionDefaults_(const String & /*section*/) const
  {
    return SpectraMerger().getParameters();
  }

  ExitCodes main_(int, const char **)
  {
    //-------------------------------------------------------------
    // parsing parameters
    //-------------------------------------------------------------
    String in(getStringOption_("in"));
    String out(getStringOption_("out"));
    String merging_method(getStringOption_("merging_method"));

    //-------------------------------------------------------------
    // reading input
    //-------------------------------------------------------------
    FileHandler fh;
    FileTypes::Type in_type = fh.getType(in);

    PeakMap exp;
    fh.loadExperiment(in, exp, in_type, log_type_);
    exp.sortSpectra();

    //-------------------------------------------------------------
    // calculations
    //-------------------------------------------------------------

    SpectraMerger merger;
    merger.setParameters(getParam_().copy("algorithm:", true));
    if (merging_method == "precursor_method")
    {
      merger.mergeSpectraPrecursors(exp);
    }
    else if (merging_method == "block_method")
    {
      merger.mergeSpectraBlockWise(exp);
    }

    //-------------------------------------------------------------
    // writing output
    //-------------------------------------------------------------


    fh.storeExperiment(out, exp, log_type_);

    return EXECUTION_OK;
  }
 
  int main(int argc, const char ** argv)
{
  TOPPSpectraMerger tool;
  return tool.main(argc, argv);
}

};




   
    
 


   

}

MRWhite

Geç bir cevap ama belki başkaları yararlanır.


static {
  try
    System.loadLibrary("packagename");
  catch(Exception e)
    e.printStackTrace();
}


olarak kullanabilirsin.