質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

JNI

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

Java

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

Q&A

解決済

3回答

447閲覧

JNAでCを動かしたいのですが...

YuyaMiyaji

総合スコア11

Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

JNI

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

Java

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

0グッド

0クリップ

投稿2018/11/10 09:33

編集2018/11/10 13:57

前提・実現したいこと

scalaで行列積をする際,高速化しようと思いCで書き,JNAを用いてJavaにしようと思っています.
Cのコンパイルは通ったのですが肝心のJNAがうまくできません
以下のソースでおかしいところをご指摘,訂正の仕方を教えてください.

発生している問題・エラーメッセージ

javac -cp jna-4.5.2.jar Plas.java
Plas.java:15: エラー: ')'がありません
plas.matmul(Float A[],Float B[],Float C[],Int M,Int N,Int K);
^
Plas.java:15: エラー: 文ではありません
plas.matmul(Float A[],Float B[],Float C[],Int M,Int N,Int K);
^
Plas.java:15: エラー: ';'がありません
plas.matmul(Float A[],Float B[],Float C[],Int M,Int N,Int K);
^
Plas.java:15: エラー: ';'がありません
plas.matmul(Float A[],Float B[],Float C[],Int M,Int N,Int K);
^
Plas.java:15: エラー: 文ではありません
plas.matmul(Float A[],Float B[],Float C[],Int M,Int N,Int K);
^
Plas.java:15: エラー: ';'がありません
plas.matmul(Float A[],Float B[],Float C[],Int M,Int N,Int K);
^
Plas.java:15: エラー: ';'がありません
plas.matmul(Float A[],Float B[],Float C[],Int M,Int N,Int K);
^
Plas.java:15: エラー: 文ではありません
plas.matmul(Float A[],Float B[],Float C[],Int M,Int N,Int K);
^
Plas.java:15: エラー: ';'がありません
plas.matmul(Float A[],Float B[],Float C[],Int M,Int N,Int K);
^
Plas.java:15: エラー: ';'がありません
plas.matmul(Float A[],Float B[],Float C[],Int M,Int N,Int K);
^
エラー10個

該当のソースコード

scala

1import com.sun.jna.Library; 2import com.sun.jna.Native; 3 4interface PlasLib extends Library { 5 // loadLibraryの第一引数はあとで作成するlib***.soの***と一致させる。 6 PlasLib INSTANCE = (PlasLib) Native.loadLibrary("matmul", PlasLib.class); 7 8 // Cの関数名と一致させる 9 void matmul(Float A[],Float B[],Float C[],Int M,Int N,Int K); 10} 11 12public class PlasJNA { 13 public static void main(String[] args){ 14 PlasLib plas = PlasLib.INSTANCE; 15 plas.matmul(Float A[],Float B[],Float C[],Int M,Int N,Int K); 16 } 17}

試したこと

カンマを;に変えたりと見た目のエラーには対処したのですが...

補足情報(FW/ツールのバージョンなど)

Macで行なっています.環境の問題でしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/11/10 09:41

ソースコードはマークダウンのcode機能を利用してください
euledge

2018/11/10 12:23

タイトルの JAN は JNAの誤りなので訂正をお願いします
KSwordOfHaste

2018/11/10 14:22

Scalaのコードを書こうとしておられるのでJavaのタグは外したほうがよかったかも知れません。「Javaのコードが必要かも知れない」とお考えだったのかも知れませんが。
KSwordOfHaste

2018/11/10 14:28

おっと・・・コードタグにScalaとあったのでScalaのつもりかと思いきやソースの拡張子が思いっきりjavaでしたね。どちらで書こうとされていたかははっきりわかりませんが・・・一応Scalaのみで書く方法を回答しました。
guest

回答3

0

コードを拝見すると質問者さんはJavaのJNAのサンプルなどをご覧になってそれをなんとかScalaで書こうとして失敗してしまっているように感じました。JavaとScalaのどちらの仕様に曖昧さがあるのかコードからは読み取れませんが、失礼ながらかなり混沌とした感じです(※)。

※: 例えばScalaにはinterfaceはなくそれにあたるのはtraitです。またstaticという修飾子はなく、mainメソッドはclassではなくobjectに書きます。

も少しScalaについて文法をよく確認した方がよいと思いますが・・・個人的にScalaのみでJNAを直接使うことに興味があったのでわたくしも挑戦してみたので、いけそうなコード例をご紹介してみます。

なお、C側の関数は
void matmul(float a[], float b[], float c[], int m, int n, int k);
と宣言されていると仮定してます。

Scala

1import com.sun.jna._ 2 3object PlasLib { 4 Native.register("matmul") 5 // JavaではLibraryを継承したinterfaceを定義し、loadLibraryを使うが 6 // Scalaとして書くならregisterが便利なようです。 7 8 // 詳しくは自分も説明できませんが、JNAが認識できるようなシグナチャーのメソッドしか 9 // 書けないと思います。Javaのprimitive型相当の型とその配列ぐらいなら大丈夫だと思います。 10 @native def matmul(a: Array[Float], b: Array[Float], c: Array[Float], 11 m: Int, n: Int, k: Int): Unit 12} 13 14object PlasJNA { 15 def main(args: Array[String]): Unit = { 16 val a = Array(1.0F, 2.0F, 3.0F) 17 val b = Array(1.0F, 2.0F, 3.0F) 18 val c = Array(1.0F, 2.0F, 3.0F) 19 PlasLib.matmul(a, b, c, a.length, b.length, c.length) 20 } 21}

ただし、C側で引数の配列領域へ結果を返すなんてことをしようとするならもうちょっとJNAを研究した方がよさそうですね。

投稿2018/11/10 14:18

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

void matmul(Float A[],Float B[],Float C[],Int M,Int N,Int K);

Javaの文法ではありません。
「java 入門」でぐぐって、そこに出ているのを一通り読んでみましょう

投稿2018/11/10 13:35

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

public class PlasJNA { public static void main(String[] args){ PlasLib plas = PlasLib.INSTANCE; plas.matmul(Float A[],Float B[],Float C[],Int M,Int N,Int K); } }

の中の

plas.matmul(Float A[],Float B[],Float C[],Int M,Int N,Int K);

っておかしくないですか?
この場所に書くのはメソッドの呼び出しであってメソッドの定義ではないです。
なので書くとするなら下記のような感じではないでしょうか?

Float A[] = new Float[]{1.0F}; Float B[] = new Float[]{2.0F}; Float C[] = new Float[]{3.0F}; plas.matmul(A, B, C, 1, 2, 3);

また、Javaには Int という型はないです。 小文字のintの誤りです。

JNAは私も使用してますが、下記記事が参考になります。
JNIより簡単にJavaとC/C++をつなぐ「JNA」とは

投稿2018/11/10 12:22

euledge

総合スコア2404

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問