質問編集履歴

2 追記2

taratail

taratail score 70

2017/01/24 23:30  投稿

Javaから静的ライブラリ(.a)の関数を呼び出す
静的ライブラリをJavaから呼び出す方法について教えていただきたいです。
拡張子はオブジェクトファイルがアーカイブされた(.a)です。
JNIを利用しています。
```
public class MyClass {
 static {
   System.loadLibrary("MyLibrary");
 }
}
```
として、`java`コマンドにjava.library.pathを指定して読み込もうと致しましたが、`UnsatisfiedLinkError`となります。`libMyLibrary.a`ではなく、`libMyLibrary.so`の共有ライブラリしか認識していないように思えます。
共有ライブラリではなく、静的ライブラリを読み込む方法はあるでしょうか。
**追記**
言葉足らずな点があり申し訳ございません。回答して下さった方に対する返信と全く同様の追記を致しました。
Java8では静的ライブラリを読み込める仕様になったという記述がございました。これについてですが、  
 
java -version によって以下のように表示されます。
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
http://qiita.com/ayihis@github/items/01f95d5d465168043ae3 の記述を見る限りだと条件を見たしていると思われます。
http://qiita.com/ayihis@github/items/01f95d5d465168043ae3 の記述を見る限りだと、Java8のバージョンの条件を見たしていると思われます。
StackOverflowの2番目の解答の返信に、System.loadLibrary()を使うだけで動くのか?と言った趣旨のコメントが付いていますが、それに対して、JVMを使えと言った趣旨のコメントがなされているかと思います。
言葉足らずで申し訳ありませんでしたが、具体的に言えばJVMを使う方法が分かりません。
また、他によりよい方法があれば、そちらの方法でも構いません。
ただ、
http://stackoverflow.com/questions/29126376/how-to-link-and-load-a-static-library-ed25519-in-jdk8
と似た状況かと思いますが、shared objectは使えない状況にいます。
  • Java

    19048 questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • C++

    5697 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • C

    5764 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • JNI

    37 questions

    JNI(Java Native Interface)は、Javaプラットフォームにおいて、Javaで記述されたプログラムと、他の言語で書かれたネイティブコードを連携するためのインタフェース仕様である

1 追記

taratail

taratail score 70

2017/01/24 23:28  投稿

Javaから静的ライブラリ(.a)の関数を呼び出す
静的ライブラリをJavaから呼び出す方法について教えていただきたいです。
拡張子はオブジェクトファイルがアーカイブされた(.a)です。
JNIを利用しています。
```
public class MyClass {
 static {
   System.loadLibrary("MyLibrary");
 }
}
```
として、`java`コマンドにjava.library.pathを指定して読み込もうと致しましたが、`UnsatisfiedLinkError`となります。`libMyLibrary.a`ではなく、`libMyLibrary.so`の共有ライブラリしか認識していないように思えます。
共有ライブラリではなく、静的ライブラリを読み込む方法はあるでしょうか。
共有ライブラリではなく、静的ライブラリを読み込む方法はあるでしょうか。
**追記**
言葉足らずな点があり申し訳ございません。回答して下さった方に対する返信と全く同様の追記を致しました。
java -version によって以下のように表示されます。
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
http://qiita.com/ayihis@github/items/01f95d5d465168043ae3 の記述を見る限りだと条件を見たしていると思われます。
StackOverflowの2番目の解答の返信に、System.loadLibrary()を使うだけで動くのか?と言った趣旨のコメントが付いていますが、それに対して、JVMを使えと言った趣旨のコメントがなされているかと思います。
言葉足らずで申し訳ありませんでしたが、具体的に言えばJVMを使う方法が分かりません。
また、他によりよい方法があれば、そちらの方法でも構いません。
ただ、
http://stackoverflow.com/questions/29126376/how-to-link-and-load-a-static-library-ed25519-in-jdk8
と似た状況かと思いますが、shared objectは使えない状況にいます。
  • Java

    19048 questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • C++

    5697 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • C

    5764 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • JNI

    37 questions

    JNI(Java Native Interface)は、Javaプラットフォームにおいて、Javaで記述されたプログラムと、他の言語で書かれたネイティブコードを連携するためのインタフェース仕様である

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る