1

JNIアプリケーションの例をたくさん見てきました。自分で試して例外が発生しました

dileepvikram@dileepvikram-System-Product-Name:~/include$ java -Djava.Library.path=. Test
Exception in thread "main" java.lang.UnsatisfiedLinkError: no Test in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1028)
at Test.<clinit>(Test.java:9)
Could not find the main class: Test.  Program will exit.

Test.java

 public class Test {
   public native void sayHello(int length) ;
   public static void main (String args[]) {
   String str = "I am a good boy" ;
   Test h = new Test () ;
   h.sayHello (str.length() ) ;
  }
  static {
    System.loadLibrary ( "Test" ) ;
  }
 }

私は彼のコードをコンパイルし、そのコードでTest.hを作成しました

javah -jni Test

Test.c

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


JNIEXPORT void JNICALL Java_hello_sayHello
  (JNIEnv *env, jobject object, jint len) {
  printf ( "\nLength is %d", len ); }
void main()
{
    printf("\nHello World\n");

}

次に、コマンドを使用してcコードをコンパイルしました

gcc Test.c -o libTest.so

次に、コマンドを使用してJavaクラスを実行してみました

java -Djava.library.path=. Test

そして、私は例外を取得しています

dileepvikram@dileepvikram-System-Product-Name:~/include$ java -Djava.Library.path=. Test
Exception in thread "main" java.lang.UnsatisfiedLinkError: no Test in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1028)
at Test.<clinit>(Test.java:9)
Could not find the main class: Test.  Program will exit.

私は多くのことを試みました、問題を見つけるために、どんな助けもありがたいです。

4

2 に答える 2

2

まず第一に、あなたのクラスはTestではなくと呼ばれますhello。したがって、関数は次のようになります。

JNIEXPORT void JNICALL Java_Test_sayHello(JNIEnv *env, jobject object, jint length)

また、ソースをコンパイルするときは、およびを使用-shared-fPICて、gcc に (実行可能ファイルではなく) 共有オブジェクトをコンパイルさせます。

gcc Test.c -shared -fPIC -o libTest.so

共有オブジェクトとしてコンパイルするということは、そもそもそこにあるべきではないmainから関数を削除できることも意味します。Test.c

于 2013-02-26T13:43:35.007 に答える
0

.export LD_LIBRARY_PATH =.、こうして現在のディレクトリのライブラリパスを設定し、Java ファイルを見つけるようにします。

于 2013-10-15T08:24:03.593 に答える