2015-09-22 2 views
4

Im новой для Java и в настоящее время учится нативные методы, когда я создаю следующие файлы:Работа с машинным методом Java-

Main.java:

public class Main { 
    public native int intMethod(int i); 
    public static void main(String[] args) { 
     System.loadLibrary("Main"); 
     System.out.println(new Main().intMethod(2)); 
    } 
} 

main.C:

#include <jni.h> 
#include "Main.h" 

JNIEXPORT jint JNICALL Java_Main_intMethod(
    JNIEnv *env, jobject obj, jint i) { 
    return i * i; 
} 

Скомпилировать и запустить:

javac Main.java 
javah -jni Main 
gcc -shared -fpic -o libMain.so -I${JAVA_HOME}/include \ 
    -I${JAVA_HOME}/include/linux Main.c 
java -Djava.library.path=. Main 

Выход:

4 

Но, когда я делаю это:

troller.java:

public class troller { 
    public native int intMethod(int i); 
    public static void main(String[] args) { 
     System.loadLibrary("troller"); 
     System.out.println(new troller().intMethod(2)); 
    } 
} 

troller.c:

#include <jni.h> 
#include "troller.h" 

JNIEXPORT jint JNICALL Java_Main_intMethod(
    JNIEnv *env, jobject obj, jint i) { 
    return i * i; 
} 

компилировать и запускать:

javac troller.java 
javah -jni troller 
gcc -shared -fpic -o libMain.so -I${JAVA_HOME}/include \ 
    -I${JAVA_HOME}/include/linux Main.c 
java -Djava.library.path=. troller 

Выход:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no troller in java.library.path 
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886) 
at java.lang.Runtime.loadLibrary0(Runtime.java:849) 
at java.lang.System.loadLibrary(System.java:1088) 
at troller.main(troller.java:4) 

Почему программа перестает работать, если я изменить название?

EDIT: После просмотра ответов, я заметил некоторые несоответствия и теперь воссозданы все файлы, но ошибка повторяется: Native.java

public class Native{ 
public native int intMethod(int i); 
public static void main(String[] args){S 
    System.loadLibrary("Native"); 
    System.out.println("In java... :)"); 
    System.out.println(new Native().intMethod(4)); 

} 
} 

Native.c

#include<jni.h> 
#include"Native.h" 

JNIEXPORT jint JNICALL Java_Native_intMethod(
JNIEnv *env, jobject obj, jint i){ 
printf("In C .... :)"); 
return i*i; 
} 

скомпилировать и запустить

javac Native.java 
javah -jni Native 
gcc -shared -fpic -o libMain.so -I${JAVA_HOME}/include \ 
-I${JAVA_HOME}/include/linux Native.c 
java -Djava.library.path=. Native 
Exception in thread "main" java.lang.UnsatisfiedLinkError: no Native in java.library.path 
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886) 
at java.lang.Runtime.loadLibrary0(Runtime.java:849) 
at java.lang.System.loadLibrary(System.java:1088) 
at Native.main(Native.java:4) 
+1

Когда вы компилируете для троллера, у вас есть файл '-I $ {JAVA_HOME}/include/linux Main.c', который по-прежнему отображается в виде файла. Разве это не должно быть 'troller.c'? – Austin

ответ

3

При генерации .h заглушки для нативных методов с javah его включить имя пакета и класса класса. Это значит, что вы можете иметь одно и то же имя метода в разных классах.

Java_Main_intMethod 

должен быть переименован в

Java_troller_intMethod 

Вы также должны изменить имя метода, если класс такой же, но изменения пакета.

Примечание: C не имеет @Override, и вы можете реализовать методы, которые не объявлены в вашем файле .h. ;)

+0

Я переименовал файл, но ошибка сохраняется –

+0

@PournimaBedarkar Я не предложил вам переименовать файл, на самом деле я указал, что имя файла не имеет значения. Я предлагаю вам снова прочитать мой ответ. –

0

Я не работал над собственным методом Java и стараюсь угадать, в чем проблема. Во втором соблюдать и запустить команду

-I $ {JAVA_HOME}/включить/Linux main.C

выглядит, как он должен иметь troller.c вместо main.C

+0

Имя файла '.c' в' C' не имеет значения. У него даже не должно быть '.c' –

+0

В принципе, как только вы скомпилировали свой файл C в библиотеку общего доступа, имя исходного файла (сколько исходных файлов у вас было) не имеет значения. Импортируется только имя файла. Но, конечно, если ваш исходный файл называется troller.c, и вы пытаетесь скомпилировать Main.c (которого не существует), gcc завершится с ошибкой. – benohead

+0

Я исправил команду, но ошибка сохраняется, посмотрите сообщение, которое я отредактировал –

1

Если вы хотите переименовать Main to Troller, вам нужно сделать это последовательно. Но ваша родная библиотека по-прежнему называется libMain.so. Поэтому, когда вы пытаетесь загрузить загрузчик библиотеки, он терпит неудачу, потому что это неправильное имя.

И поскольку ваш файл C теперь называется troller.c, ваша команда gcc либо не должна работать, либо вы компилируете неправильный файл.

+0

Это причина ошибки. +1 Как только это исправлено, посмотрите на мой ответ, который является следующей проблемой. –

+1

Да, причиной этой ошибки является libMain.so, но, конечно, вы получите другие ошибки из-за других ссылок на Main, которые должны быть Troller. – benohead

+0

Я исправил команду, но ошибка сохраняется, посмотрите сообщение, которое я отредактировал –

Смежные вопросы