LINUX.ORG.RU

Java и C


0

0

Возникла такая проблема, надо использовать ранее написанные на C функции в проге на jave. Это возможно, и если да, то как?

anonymous

Можно

Читай о JNI, native, System.loadLibrary и оформлении сишной библиотеки. Читать достаточно.

burivuh
()

Здесь все непросто и запутанно.
Действительно нужно читать много всякой литературы.
Но в кратце примерно следующие (Всегда лучше сначало
представить во что ввязываешься):

1. Пишешь класс на java с native функцией которая будет реализована на C.

//TestNative.java
import java.io.*;

public class TestNative {

  public int ID=0 ;

  public static void main(String[] argv) {
    new TestNative().nativeMethod() ;
  }

  public native int nativeMethod() ;

  static {
    System.load("TestNativeLib.so") ;
  }
}

Обрати внимание на метод с ключевым словом native,
его и нужно будет реализовать.

2. Компилишь его
javac TestNative.java

3. Создаешь файл заглушку
javah TestNative

При этом создается файл TestNative.h

А вот и он :-)
/*TestNative.h*/
* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class TestNative */

#ifndef _Included_TestNative
#define _Included_TestNative
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     TestNative
 * Method:    nativeMethod
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_TestNative_nativeMethod
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif


4. Реализуешь нативный метод
//TestNativeLib.cpp
#include <stdio.h>
#include <jni.h>
#include "TestNative.h"

JNIEXPORT jint JNICALL Java_TestNative_nativeMethod(JNIEnv *je, jobject jo) {

  int g = 0 ;

  jclass javaClass ;
  jfieldID javaFieldID ;

  printf("TestNative method is run.\n") ;

  //javaClass = je->GetObjectClass(jo) ;

  return 123 ; 
}

5. Создаешь библиотеку TestNativeLib.so

gcc -c -o TestNativeLib.o TestNativeLib.cpp -I$JAVA_HOME/include/linux -I$JAVA_HOME/include
gcc -shared -o TestNativeLib.so TestNativeLib.o

6. Типа все готово. :-))))

gapik
()

Огромное спасибо :)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.