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

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

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

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

JNI

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

Java

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

Q&A

1回答

3606閲覧

JavaからC言語(SHARED_LIBRARY)を呼び出す為のインターフェイス(型のマッピング)の書き方について

Momoco

総合スコア7

C

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

JNI

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

Java

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

0グッド

0クリップ

投稿2016/06/17 07:57

編集2016/06/17 08:39

###前提・実現したいこと
はじめまして、モモコといいます。

最近、JNIをはじめたところなのですが
環境は、Eclipseを使った JNI のビルド環境はできています。

目的は、Cで書かれたソースをSHARED_LIBRARY化して
android(Java)から呼び出したいです。

既に、C側のソースがあるのですがそれには手を加えず行いたいです。

はじめたばかりで分からないことばかりの為、
ご指摘、ご教授願えればと思います。
よろしくお願いします。

###ソースコード

C

1-------------- 2testMakeData.c 3-------------- 4/* 5* @param [in] output_file_name 出力パス名 6* @param [in] id データ取得したいid 7* @param [out] data データ 8* @param [out] dataName データ名 9*/ 10int MakeData( 11 char output_file_name[256], 12 int id, 13 unsigned char *data 14 char *dataName 15 ) 16 17この用なメソッドの場合、 18どの様にすれば良いのかわかりません。

c

1途中まで考えたのは 2testMakeData.cをラッピングするインターフェイスを作り 3Javaからはそこを呼び出す。 4----------------- 5makedata_jni_if.c 6----------------- 7#include testMakeData.c 8 9jint Java_com_example_testProject_TestApp_MakeDataJNI( 10 JNIEnv* env, 11 jobject thiz, 12 jint id, 13 jstring outputFileName, 14 jcharArray data ← これであっているのか正しい書き方が分かりません 15 jcharArray dataName ← これであっているのか正しい書き方が分かりません 16 ) 17{ 18 19 jint ret = 0; 20 const char *pOutputFileName = 21 (*env)->GetStringUTFChars( env, outputFileName, NULL ); 22 char *pData = 23 (jchar *)((*env)->GetCharArrayElements( env, data, NULL)); 24 char *pDataName = 25 (jchar *)((*env)->GetCharArrayElements( env, dataName, NULL)); 26 27 // *pData, *pDataNameも、多分このままでは行けないと思うのですが 28 // この後、どの様に扱えば良いのか分かりません 29 30 // MakeDataを呼び出す 31 ret = MakeData( 32 id, 33 pOutputFileName, 34 pData, 35 pDataName 36 37 ) 38 39 // 解放 40 (*env)->ReleaseStringUTFChars( env, outputFileName, pOutputFileName ); 41 (*env)->ReleaseCharArrayElements( env, data, pData ); 42 (*env)->ReleaseCharArrayElements( env, dataName, pDataName ); 43 44 return ret; 45 46}

Java

1String filePath "/temp/"; 2char data[] = new char[20000]; 3char dataName[] = new char[100]; 4int id = 12; 5 6int ret = MakeData(filepath, id, data, dataName); 7if(rest == RET_OK){ 8 // C側から戻ってきたデータ名 9 String str = String.valueOf(dataName); 10 // C側から戻ってきたデータ 11 ・・・・・・ 12 ・・・・・ 13} 14 15public native static int MakeDataJNI( 16 String output_file_name, 17 int id, 18 char[] data, 19 char[] dataName, 20 21 ); 22 static { 23 System.loadLibrary( "MakeData" ); 24 }

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

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

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

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

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

guest

回答1

0

紛らわしいですが、CのcharとJavaのcharはサイズが違います。
C char 1byte
Java char 2byte
Cのほうを変えることが出来ないので、java側はbyte(1byte)を使うべきかと思います。

投稿2016/06/17 08:54

masaya_ohashi

総合スコア9206

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

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

Momoco

2016/06/20 04:20

ありがとうございます。 仕様の違いがあるのですね。 C側が、unsigned char型 の場合、0〜255 Java側は、byte型で -128〜127 unsigned char *data がバイナリデータの為、 どの様に、byte型 に入れ込めば良いのでしょうか? よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問