04/08/13 10:19
>>367
試してないので間違ってるかもしれんが こんな感じにしないとダメじゃないか?
for(i = 0; i < (*env)->GetArrayLength(env, jobjArray); i++){
jintArray jintarray = (jintArray)(*env)->GetObjectArrayElement(env, jobjArray);
jint *jint = (*env)->GetIntArrayElements(env, jintarray, NULL);
for(j = 0 ; j < (*env)->GetArrayLength(env, jintarray); j++){
jint[j] = c++;
}
(*env)->ReleaseIntArrayElements(env, jintarray, 0);
}
370:デフォルトの名無しさん
04/08/13 21:53
#ifdef __cplusplus
#define ENV (*env)
#else
#define ENV env
#endif
ENV->GetArrayLength(env, array);
371:デフォルトの名無しさん
04/08/17 14:31
>>370
それC++じゃコンパイル通らんだろ。
372:デフォルトの名無しさん
04/10/14 01:11:03
>>370
逆じゃないの?
373:デフォルトの名無しさん
04/10/14 02:56:47
逆ではあるが、それを正したところでC++じゃだめだし。
374:デフォルトの名無しさん
04/12/09 00:41:58
JNIでdefineClassメソッドを使ってbyte配列から取得したクラス情報を元に、インスタンスって生成できますか?
それにしても、JNIのDefineClassってどうやって使うんだろう・・。
375:デフォルトの名無しさん
04/12/09 00:48:26
DefineClassってJNIじゃないだろ
376:374
04/12/09 00:55:46
>>375
クラス操作 DefineClass
jclass DefineClass(JNIEnv *env, jobject loader, const jbyte *buf, jsize bufLen);
raw クラスデータのバッファからクラスをロードします。
パラメータ:
env: JNI インタフェースポインタ
loader: 定義されたクラスに割り当てられるクラスローダ
buf: .classファイルデータを含むバッファ
bufLen: バッファ長
戻り値: クラスオブジェクトを返します。エラーが発生した場合は null を返します。
URLリンク(java.sun.com)
377:デフォルトの名無しさん
04/12/09 01:17:16
いや、それやりたいのならJNI必要ないだろうという意味だ
コアAPIでできるんだから
378:374
04/12/09 07:48:29
>>377
それをネイティブコードでかけるかという質問なんです。
379:デフォルトの名無しさん
04/12/09 08:06:41
>>378
書けるだろ。
JNIじゃなくてJavaのクラスファイルに関する知識が必要になるだけで。
380:デフォルトの名無しさん
04/12/09 13:37:48
>>374がどういった場面でこれを使おうとしているのかわからない・・・
381:374
04/12/09 21:56:27
>>379
Javaオンリーでは実装したことあるのですが、
JNIに移植したとたんセキュリティエラーになりませんか?
382:デフォルトの名無しさん
04/12/09 22:58:25
あふぉぅな質問するけどよ
JNIって何て読むの??
ジニ??
ジェイエヌアイ
読めなくて"Java Native Interface "って読んでまつ。。
383:デフォルトの名無しさん
04/12/09 22:59:57
IT用語辞典 e-Words : JNIとは 【Java Native Interface】 ─ 意味・解説
URLリンク(e-words.jp)
384:デフォルトの名無しさん
04/12/11 12:30:12
>>379
書いてみて。
385:デフォルトの名無しさん
04/12/11 12:32:09
書いてみた。
386:デフォルトの名無しさん
04/12/11 12:52:25
>>385
ん?どこに?
387:デフォルトの名無しさん
04/12/13 13:46:25
.netのC#で作った.dllファイルでJNIってできませんか?
388:デフォルトの名無しさん
04/12/13 18:49:12
>>387
それを言うなら
#NI(シャープニー)だろ?
グぐれ
389:デフォルトの名無しさん
04/12/14 03:15:20
>>387
.netのC#で作った.dllファイルのメソッドを呼ぶdllを作ればいい
390:デフォルトの名無しさん
04/12/18 21:10:34
>>376
JNIインタフェースのDefineClassって、
バージョン毎にシグネチャが異なるのか?
それともヘルプが間違ってるだけなのか?
あと使い方誰か教えてくれ。
何度やってもネイティブコード上でうまくインスタンスを取得できない。
391:デフォルトの名無しさん
04/12/18 21:48:44
URLリンク(www.atmarkit.co.jp)
392:デフォルトの名無しさん
04/12/18 22:24:33
>>391
……上手くいかない理由がわかったような気がする。
393:390
04/12/18 23:04:05
>>392
教えてくれ!
何が原因なんだ。
つーか、仕様上無理なのか?
394:デフォルトの名無しさん
04/12/18 23:08:43
つーか、バイトコードを暗号化しても、すぐにやぶられるって。
395:デフォルトの名無しさん
04/12/18 23:10:13
>>394
>>390 がやっても、ってんなら同意。
396:デフォルトの名無しさん
04/12/19 13:04:15
どうせVMが実行するときにデコードしてるんだからいみないな
397:390
04/12/19 13:40:24
>>394
>>395
>>396
そこからクラスファイルを生成し、ソース入手可と言っている?
398:デフォルトの名無しさん
04/12/19 15:41:10
> そこからクラスファイルを生成し、ソース入手可と言っている?
可能。
せいぜい>390がいくら頑張っても、Jad使ってお手軽一発変換、ってのを防ぐ程度の
ことしかできんだろう。
399:デフォルトの名無しさん
04/12/19 16:02:26
そういうこと
苦労してJNIでクラスローダ作ったところでいくらでもいじられるんだし
JNIのコードだってスタックサイズの制限とかで大きいの作れないんだから
余裕で解析されるだろうな
それくらいなら帯域とかあるだろうがURLクラスローダを継承して通信を暗号化、
毎回ロードするほうがまだ現実的
ネトゲとかでいくらネイティブコードでもbotとかツールとかなくせないわけだしね
安全性のためにJNIってのは意味ない
400:デフォルトの名無しさん
04/12/20 00:03:00
>>399
> それくらいなら帯域とかあるだろうがURLクラスローダを継承して通信を暗号化、
> 毎回ロードするほうがまだ現実的
「まだ現実的」ってのがどういうことを意図しているのかよくわからんが、
JNIでクラスローダ作るのって大した手間じゃないし
ネットワークを意識しなきゃならんほうがいろいろ面倒だと思うがね。
401:390
04/12/20 00:21:26
>>399
> それくらいなら帯域とかあるだろうがURLクラスローダを継承して通信を暗号化、
> 毎回ロードするほうがまだ現実的
それこそURLクラスローダクラスをリバースコンパイルされるので、無意味のような気が・・・。
データの暗号化で無く、データを扱うモジュールの暗号化をここでは問題視しているんです。
>>400
>JNIでクラスローダ作るのって大した手間じゃないし
おお!本当ですか?
是非是非ソースレベルで教えてください。
先ほどちょっと妥協して試してみたんですが、
FileInputStreamをJNIで実装しようとしたんですが、
これもやはりうまくいきませんでした・・。
JNI、むずいっす。
402:デフォルトの名無しさん
04/12/20 00:48:32
クラスが暗号化されようとJREの上で動くときには普通のクラスだろ
403:デフォルトの名無しさん
04/12/20 11:22:32
たぶん390はVMの中は外から絶対のぞけないと思い込んでいるに一票。
404:デフォルトの名無しさん
04/12/20 21:43:16
この辺を参考にしてから googleで検索してみろ
URLリンク(java.sun.com)
405:デフォルトの名無しさん
04/12/21 13:59:21
初歩的な質問かもしれませんが、教えてください。
JavaからJNIを利用して既存のdllにアクセスする場合、オススメの方法はあるでしょうか?
何通りかあるのかもしれませんが...。
「既存のdllは一切変更しない」ことが条件です。
たとえば、間にラッパー(?)をかますとして
「dllを指定し、利用するAPIを選択すると自動でラッパー(またはそのベース部分)を生成してくれるツール」とか...。
Java以外の言語にも精通し、JNIゴリゴリが得意な方は不要かもしれませんが、
「JavaからJNIを利用して既存のdllにアクセスする」を目的とする場合、需要があると思うのですが?
よろしくお願いします。
406:デフォルトの名無しさん
04/12/21 16:15:32
ラッパーつくるしかないよ
大概符号つきをどうするかとかその辺があるわけで
407:デフォルトの名無しさん
04/12/23 18:18:03
質問ですが、一般的にJNIといった場合、JVMTI,JVMPI,JVMDI等はその中に含まれると考えていいのでしょうか?
408:デフォルトの名無しさん
04/12/23 19:17:20
それらすべてともちがうかと
JNIといった場合はネイティブコードを呼び出す、もしくはネイティブコードからJVMを呼び出すのが目的だから
ってすべて検索すれば詳細出てくるんだが釣り?
409:デフォルトの名無しさん
05/02/10 02:40:02
知恵を貸して下さい.
現在CからJavaを呼び出すコードを書いています.
Javaのコードを呼び出す度にJVMを生成するのはコストが大きいと思われるで,
改善したいと思っていますが良い方法が分かりません.
現在のコードを抽象化して以下に示します.
int main(void){ for(int i=0;i<500;i++){ hoge(); } return 0; }
void hoge(void)
{
...
JNI_GetDefaultJavaVMInitArgs...
JNI_CreateJavaVM...
env->CallStaticVoidMethod...
jvm->DestroyJavaVM...
...
}
public class HelloVM { static void hello() { System.out.println("HelloVM(Java) executed.\n"); } }
現在は上記の様な感じで,500回helloメソッドを呼ぶ度にJVMを作成しています.
しかしこれでは作成に失敗することが多々あります.
もっと良い方法はないでしょうか?
410:デフォルトの名無しさん
05/02/10 03:04:34
> 失敗する
どのような失敗
411:409
05/02/11 03:38:07
>>410
2回目以降の JNI_CreateJavaVM が失敗しているって感じです.
今は手元にコードがないので,後日詳細な報告をします.
412:409
05/02/12 06:25:57
>>410
例えば下記のサイトのコードを流用したとします.
URLリンク(www.ki.rim.or.jp)
public class HelloVM { static void hello() { System.out.println("HelloVM(Java) executed.\n");} }
#include "stdafx.h"
#include "jni.h"
int hoge(void)
{
// 前略
nResult = JNI_GetDefaultJavaVMInitArgs(&vm_args);
if ( nResult == 0 ) { printf("Success to JNI_GetDefaultJavaVMInitArgs vm.\n");}
else { printf("Fail to JNI_GetDefaultJavaVMInitArgs vm.\n"); }
// 中略
nResult = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if ( nResult == 0 ) { printf("Success to create vm.\n"); }
else { printf("Fail to create vm. [%ld]\n", nResult); return 0; }
// 後略
return 0;
}
int main(void){ for(int i=0;i<3;i++){ hoge(); } return0; }
こんな感じのコードを実行すると,ループの初回は HelloVM(Java) executed. が出力されます.
しかしループの2回目は Fail to create vm. が出力されます.
このことからJVMの作成に失敗したと考えました.
# 当然ですが上記のようなループを含まないJNIのプログラムは正常に動作します.
現在は AttachCurrentThread と DetachCurrentThread が,
関連するのではないかと思っているのですが間違っていますでしょうか.
413:デフォルトの名無しさん
05/02/12 09:51:15
エラーコード・・・
414:デフォルトの名無しさん
05/02/12 14:03:45
>>412
エラーコードを出し惜しみするのは宗教上の理由か?もう答える気なくした。
415:409
05/02/12 15:59:55
あーすいませんorz
エラーコードは -1 が返ってきているのですが jni.h で確認したところ
JNI_ERR (-1) /* unknown error */
ってことは…原因は何なんでしょ.
416:デフォルトの名無しさん
05/02/13 23:58:42
DLLからJavaのメソッドって呼べる?
417:デフォルトの名無しさん
05/02/14 00:30:03
超呼べる。呼びまくり。
418:デフォルトの名無しさん
05/02/14 02:40:44
>>417
おぉJNIって凄いんだ
それってDLLの中でJVMを作成して?
それともよくあるサンプルみたいにコールバックでって意味で?
419:デフォルトの名無しさん
05/02/14 09:23:52
どっちがやりたいん?
ほとんどの場合はnative methodの実装ですむはずだけど・・・
420:デフォルトの名無しさん
05/02/14 11:04:52
どっちて言いますか…
EXE→DLL→Javaのメソッドって感じにしたいんです
それで普通にEXEからJavaのメソッドを呼ぶ方法は分かるんです
でもDLLの中でJVMを作成して呼ぶ方法を試していて失敗してるんです
ClassFindって関数で失敗してるんで、クラスパスの設定あたりかもしれないんですけどorz
それで>>418の質問をしたんです
どうかDLLの中でJVMを作成して、そこからJavaを呼ぶ方法を教えてください
421:デフォルトの名無しさん
05/02/14 19:30:01
え、ClassFindのエラーの原因を調べればいいんじゃないの
422:デフォルトの名無しさん
05/02/22 19:48:43
面白そうなことやってるな
423:デフォルトの名無しさん
05/06/17 17:21:30
NIOっていうかDirectByteBufferを駆使しようぜ
424:デフォルトの名無しさん
05/06/19 13:16:52
jarファイルをexeに変換するexewrapというツールがある。
これソースを公開してる。JNI使ってVM作ったり、
exe埋め込みリソースからクラスを生成しているようなので
参考になるかもしれんよ。
425:デフォルトの名無しさん
05/06/19 13:45:58
DirectByteBufferってアレだな
X11のshm拡張に似たものがあるな
単なるバイト列をやり取りする需要ってどんなもんだろう
画像とかか?
426:デフォルトの名無しさん
05/06/19 14:31:18
でもデスクトップ上で扱うタイプなら単純なバイト列というより
BufferedImageとかで扱うことが多いもんだから
shortやint型配列とかのほうがオーバーヘッドもないし便利
427:デフォルトの名無しさん
05/07/06 23:21:04
LinuxでJNIで何か処理をすると、StackOverflowErrorが発生するのですが、
何か情報ないでしょうか?
428:デフォルトの名無しさん
05/07/06 23:58:15
Windowsでも同じく発生するよ
スタックはかなり小さくないと動かない模様
Java自体のソースコードを修正してコンパイルしなおしが必要
429:デフォルトの名無しさん
05/07/07 00:06:36
>>425
ByteBufferからIntBufferやShortBufferに変換できるから無問題
430:デフォルトの名無しさん
05/07/07 00:20:21
>>428
Windowsで同じソース(ネイティブコードは除く。ただし、処理内容は同じ)を走らせても
StackOverflowError は発生しないのにLinuxでは発生してしまいます。
何が原因なのか調べる手段だけでもアドバイスもらえないでしょうか?
431:デフォルトの名無しさん
05/07/07 00:48:35
スタックサイズを指定すればいいんでないかのぉ?
URLリンク(66.102.7.104)
432:デフォルトの名無しさん
05/07/07 00:57:08
残念ながらJNIのスタックサイズは有効にならないよ
433:デフォルトの名無しさん
05/07/07 00:58:14
>>430
Java自体のコンパイルってのはVMのことね
J2SE5.0の新しいライセンスでダウンロードしてコンパイルしなおすしかない
434:デフォルトの名無しさん
05/07/07 20:52:39
>>433
残念ながら、アプリの配布をVMと一緒にという訳にはいかないので
何か違う方法を探してみます。
ちなみに、JNIに関わりの無いところでは、相当量のスタックを使ってもオーバーフローしていません。
435:デフォルトの名無しさん
05/07/07 21:06:17
>>434
当たり前
Javaのスタックとはまったく別物だし
436:デフォルトの名無しさん
05/07/08 00:21:16
原因が分かりました。
ネイティブ側のメモリリークに、ガーベッジが重なったときにVMがアボートしていました。
どうりで特定の場所で落ちない訳です。
StackOverflowErrorはVMが異常な状態のときにスローされていたので、
恐らく関数ポインタがズレたせいだと思います。
437:デフォルトの名無しさん
05/10/02 14:10:30
>>425
亀レスやけど、
DDAとか、memory mapped I/Oとか、
特に組み込みでVRAMなんかに使うんでしょ。
438:デフォルトの名無しさん
05/10/04 15:07:02
DLL から JNI を呼ぶ場合、DestroyJavaVM()は、他にJavaVMを使用中の
スレッドが存在すると JavaVM がアンロードできないみたい。
(DestroyJavaVM() で終了まちになる・・・)
強制的に DestroyJavaVM() でJavaVMをアンロードする方法ってあるの?
439:デフォルトの名無しさん
05/10/04 17:07:35
えーと、マルチスレッドプログラミングの基本なんですが、
スレッドは、各々自分の責任において、終了処理を行うべきです。
// Thread.stop()がdeprecatedであるのと同じ理由。
ですから、JVM内できちんとThreadの終了を行うのが正当なやり方です。
どうしても強制的に終了したければ、
JVMのなかでdeprecatedなThread.stop()を矯正終了用のmethodで使ってみてください。
URLリンク(java.sun.com)
440:デフォルトの名無しさん
05/12/19 19:39:34
Cで作ったクラスインスタンスや構造体をJavaに渡すことは可能?
Javaで使えなくても、次のDLLの関数呼びに使うために
441:デフォルトの名無しさん
05/12/21 09:03:27
long値にポインタつっこもうぜ
442:デフォルトの名無しさん
05/12/21 20:11:40
それでDLL側で作ったメモリの領域が保たれるのか。
CとJava別個に考えてたけど、普通に使えるのね。
やってみる。
443:デフォルトの名無しさん
05/12/21 23:30:29
保たれはせんだろ。単なるポインタだし。
444:ハーピィ
05/12/24 01:08:28
E・∇・ヨノシ <444ゲット♫
445:デフォルトの名無しさん
06/02/15 11:09:40
消えちゃ勿体ないのでageちゃいます
446:デフォ
06/03/18 14:47:41
ふんとだもっだいね。
447:デフォルトの名無しさん
06/03/24 11:41:57
Bufferクラスって
JNIで実装されてるんだよね
448:デフォルトの名無しさん
06/03/27 14:03:54
外部メモリを取るやつがあるからな
449:デフォルトの名無しさん
06/04/09 08:02:11
void getValues(long &x, long &y);
のような関数をJNIで呼びたいのですが、
それにはx, y をメンバーに持つオブジェクトを使う
しかないのでしょうか?
450:デフォルトの名無しさん
06/04/09 21:19:38
そう。
あとその質問にJNIは関係ない。
451:デフォルトの名無しさん
06/04/15 16:32:50
cygwin環境でjava動かしてるんだけど.soって読み込む方法ってあるかな?
452:デフォルトの名無しさん
06/04/17 08:22:40
Windows XP SP2
Java 2 SDK 5
JavaからDLL内のCの関数呼び出して、さらにそのCの関数の中から
Javaのメソッド呼び出すことはできるんだけど、
CからJNI_CreateVMで直接Java VMを生成しようとすると失敗します。
上記の環境に加えてjvm.dllにパスが通っているだけではだめなんでしょうか?
JNI_CreateVMの戻り値は-1です。
453:デフォルトの名無しさん
06/04/17 10:08:07
すみません、JNI_CreateJavaVM の間違いでした。
JREをインスコすると C:\Windows\java.exe が
インストールされるので、Java プログラムを
実行している分にはパスのことを気にしなくてもいいんですが、
JNI でごりごり遊ぶにはいろいろとパスを通さなくては
なりませんか?面倒なのでネイティブプログラムと
同じディレクトリに jvm.dll をコピーしてるんですが。
454:デフォルトの名無しさん
06/04/17 13:20:39
> 同じディレクトリに jvm.dll をコピーしてるんですが。
これが原因と見た。
455:デフォルトの名無しさん
06/04/17 13:26:35
>>454 やっぱそうですか・・・
Windows で JNI で遊んでる皆さん、
よかったらJava関連ではどこにPATHを通してるか、
さらしてもらえませんか??
>>452 のように Java アプリから呼び出した
C の関数から、さらに Java のメソッドを
コールバックさせることはできているので、
まったく何もかもがうまくいっていない、
というわけじゃないと思うんです。
456:デフォルトの名無しさん
06/04/17 15:09:26
息長ぇなこのスレ。
457:デフォルトの名無しさん
06/04/18 00:04:55
Java Forums - can't create java vm ... setting path for jvm.dll
URLリンク(forum.java.sun.com)
この辺も眺めながらもういっぺんトライしてみます。
458:デフォルトの名無しさん
06/04/19 02:48:31
質問です。
Java 5から導入されたアノテーション情報(特にクラスに埋め込んであるタイプのもの)に、
JNIからアクセスできるのでしょうか。
SunのサイトにJNI 5.0とかいうのがあったので見てたのですが、それらしいものは見つかり
ませんでした。どんなものでしょうか。
459:デフォルトの名無しさん
06/04/19 08:33:43
JAVAからJVMのメリットをなくしたらデメリットしか残らない
460:デフォルトの名無しさん
06/05/22 09:43:09
JNIでネイティブのDLLを呼び出すJAVAアプリ作ったんだけど、
JARファイルにまとめると動いてくれないよ。(エラーも出ずに何も反応無く終了する)
JARファイル中のDLLを読み込むにはloadLibraryかloadじゃなくて
findLibraryかなにかで読み込めば良いの?
461:デフォルトの名無しさん
06/05/22 10:00:30
>>460
標準のJNIのローダーはjarに対応してたっけ?
ネイティブのファイルシステムに置いて無いとダメじゃないのか?
462:460
06/05/22 14:03:16
>>461
即レスあんがと。
レス424のexewrapを使ってGUIでexeにしてみると
java.lang.UnsatisfiedLinkError: no dllname in java.library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
以下略
ってエラーログ出てたのでDLL読めてないみたいです。
試しに、DLLを含めずにJAR作って、別途フルパス指定でHDD上のDLLをloadすると
動きました。
463:デフォルトの名無しさん
06/05/22 14:44:43
DLLはJavaの仕組みではなくWindowsの仕組みだからな。
464:デフォルトの名無しさん
06/06/27 09:56:25
>>462
URLリンク(www-06.ibm.com)
465:デフォルトの名無しさん
06/07/04 21:18:40
時給1000円でJava教えてくださるかたを募集します
場所 所沢(池袋・高田馬場から直通)
i-want-to-study-java@hotmail.co.jp
(アドレスは全角で書いてあるので半角に直してください)
よろしくおねがいします
466:デフォルトの名無しさん
06/07/05 02:21:36
コンビニのバイトより安いですが、よろしくお願いします。
467:デフォルトの名無しさん
06/07/05 21:37:03
もち交通費別だよな
468:デフォルトの名無しさん
06/07/05 23:55:10
値段交渉したら、時給上げてくれた
469:デフォルトの名無しさん
06/07/12 10:54:51
はじめまして,今までJavaしか触ったことがなかったのですが,
470:469
06/07/12 11:11:20
すみません,間違えてエンター押しちゃいました;;
Win32APIを使う必要があり,JNIにを使い始めたものです.
C++側でから渡されたString型の引数はjchar型として扱うようなのですが,
jchar→WCHARの変換はどのようにすればよいのでしょうか?
const WCHAR *Uni = env->GetStringChars(jstring, NULL);
のようにすれば普通にWCHAR形式として取り込めると書いているページも
あったのですが,こちらの環境では
> 'const jchar' から 'const WCHAR *' に変換できません。
とエラーがでます.
URLリンク(www.ki.rim.or.jp)
を参考にして,せめてWideCharToMultiByteを使ってSHIFT_JISに変換しようとしても,
>'WideCharToMultiByte' : 3 番目の引数を 'const jchar *' から 'LPCWSTR' に変換できません。
とエラーがでます.
どのようにすればjchar→WCHARの変換ができるのでしょうか?
当方の環境は
Java
jdk 1.5.0_06
Eclipse 3.1(Java5でコンパイル)
c++
VC++2005 Express
です.
471:デフォルトの名無しさん
06/07/12 13:09:44
CHAR *GetStringFromJstring(JNIEnv *env, jstring jstr)
{
CHAR *sjisCode = 0;
INT32ret = 0;
const jchar *jchr = 0;
INT32jlen = 0;
// jstringがNULLではないときのみ処理を行う
if(jstr != NULL)
{
// 文字列、文字長の取得
jchr = env->GetStringChars(jstr, NULL);
jlen = env->GetStringLength(jstr);
// バッファの確保(すべて2バイト文字だった場合を想定)
sjisCode = (CHAR *)malloc(jlen * 2 + 1);
if (sjisCode != NULL)
{// メモリ確保成功
memset(sjisCode, 0, (jlen * 2 + 1));
// コード変換
ret = WideCharToMultiByte(CP_ACP, 0, jchr, jlen, sjisCode, jlen * 2 + 1, NULL, NULL);
sjisCode[ret] = '\0';
}
// 取得文字列の開放
env->ReleaseStringChars(jstr, jchr);
}
return sjisCode;
}
472:469
06/07/12 14:15:25
>>471
ありがとうございます.早速試してみます.
また何かあったら,書き込むかもしれないのでよろしくお願いします.
473:469
06/07/12 14:25:36
>>471
連続ですみません.
>ret = WideCharToMultiByte(CP_ACP, 0, jchr, jlen, sjisCode, jlen * 2 + 1, NULL, NULL);
やはりの部分で
>3 番目の引数を 'const jchar *' から 'LPCWSTR' に変換できません。
と出てしまいます.
なにか宣言が抜けたりしているのでしょうか?
474:471
06/07/12 15:02:49
VisualStudio6.0SP6の環境では問題無くコンパイルして動作しておりましたが、
VC++2005 Expressで駄目な理由は判りかねます…。
475:471
06/07/12 15:25:57
(LPCWSTR)jchr
明示的にキャストしても駄目でしょうか?
476:469
06/07/12 21:07:20
>>475
ありがとうございます!!
無事にできました.今までずっとJavaしか触ったことがなかったのですが,
今回C++を触り始めて改めてJavaのありがたさを思い知ってます.
477:デフォルトの名無しさん
06/07/17 20:59:54
時給1000円でJava教えてくださるかたを募集します
場所 所沢(池袋・高田馬場から直通)
よろしくおねがいします
i-want-to-study-java@hotmail.co.jp
教える対象は超初心者です。
専門学校などでJavaを勉強されていて夏休みだけ教えたいという方も歓迎です
478:デフォルトの名無しさん
06/07/18 05:15:38
> 465-468
479:デフォルトの名無しさん
06/09/05 22:25:34
JNIの勉強をしているのですが,CPU使用率のように連続的にデータを取得する際,
Java側からwhileループをまわして何度もdllを読み込むという非効率な方法をとっています.
一度dllを呼び出すだけで連続的に返り値を読み取る方法はあるのでしょうか
ご教授お願いします.
480:デフォルトの名無しさん
06/09/05 22:36:18
>>479
dll読み込む、dll呼び出すってのが、具体的に何を指して言ってるのかわからん。
481:479
06/09/07 12:53:19
>>480
言葉が足りなくてすみません.
dll読み込む、dll呼び出すというのは,ネイティブメソッドを実行するという意味で書きました.
現在はネイティブメソッド実行時に,返り値としてCPU使用率を取得しているのですが,
この方法ではJava側でWhileループで何度もネイティブメソッドを実行する必要があります.
ネイティブメソッド側でWhileループをつかってJavaに連続的に値を返す方法は
ないのでしょうか
482:デフォルトの名無しさん
06/09/07 18:52:07
>>481
ネイティブ側では java.nio.ByteBuffer#allocateDirect(int) で得られるバッファに随時書き込んで
Java側はポーリングするだけ、とかならメソッド呼び出しの負荷は減るかもしらん。
ただし、取りこぼしが考えられるので完全な連続性は保証できないし
同期処理とかを考えると取り扱いはかなり面倒になるし、
同期処理は下手すりゃネイティブメソッド呼び出しよりも高くつく可能性もある。
自分の技術力とか、CPU使用率がどれだけ必要なのかとかを良く考えた方が良いかも。
ま、裏技的な事をする前にネイティブメソッド呼び出しが
本当にボトルネックになってるのか検証する事をオススメするけどね。
何の検証もせずに、ネイティブメソッド呼び出しが遅いとか聞きかじった程度なら、
上記みたいな事をしても無駄だと思う。
483:デフォルトの名無しさん
06/09/10 12:57:34
>>481
dllでOSのスレッド作って、そのスレッドでjvmにアタッチして、
whileループ回しながら、適時、Listener経由でコールバック。
484:デフォルトの名無しさん
06/09/11 01:39:27
>>483
結局ネイティブ->Javaのメソッド呼び出しのコストが必要になるけどね。
485:名無しさん@お腹いっぱい。
06/12/07 15:12:29
関連wiki
URLリンク(wiki.ninki.org)
486:デフォルトの名無しさん
06/12/07 19:57:23
Cで書いたプログラム上でJVMを生成して、クラスをロードしようと思ってるんだけど、
Invocation APIでJVMを作るサンプルができたので、デバッグメッセージをファイルにだそうとしたら、セグメンテーションフォルトで落ちるようになってしまった。
いろいろ削っていって、
FILE* f;
↑この一行があるかないかだけで、セグ(ryが起きるかどうかが変わるんだが、
これどう解決したらいいだろうか?
487:デフォルトの名無しさん
06/12/07 22:19:52
Java専用のCコンパイラがあったらなとは思う。
ソースコード一式セットしておけば
Antみたいのが走ってそのOS向けにビルドとか。
dllとかいちいち作らせるのも忍びない
488:デフォルトの名無しさん
07/04/22 23:55:47
489:デフォルトの名無しさん
07/05/26 21:11:12
Java Native Access (JNA): access native libraries with pure Java code.
URLリンク(jna.dev.java.net)
JNative, Java framework for DLL access for Windows and Linux
URLリンク(jnative.free.fr)
nlink: NLink - Native Library Linker:
URLリンク(nlink.dev.java.net)
490:デフォルトの名無しさん
07/05/26 22:56:51
JNIと何が違うの?
491:デフォルトの名無しさん
07/05/26 22:58:03
>>490
自分で一切ネイティブコード書かなくて良い点が違うんでは?
492:デフォルトの名無しさん
07/05/27 00:12:37
.NETでいうP/Invokeのようなもんか?
493:デフォルトの名無しさん
07/06/24 11:08:18
すみません。
JavaからFortranのプログラム呼ぶことって可能なのでしょうか?
計算処理はFortranでやってて、それをJavaから呼ぶ必要があるんですが。
494:デフォルトの名無しさん
07/06/24 19:48:04
ルーチン名がマングリングされないようにコンパイルすれば出来ると思う。
大文字に固定されるとか、末尾にアンダーが入るとかするなら
C言語でラッパを書けばいい。
495:デフォルトの名無しさん
07/07/27 18:47:25
Java側からCクラスオブジェクト丸ごと読み込んで、中のメソッド制御したいんですが、
こういう使い方ってJNIで出来るんでしょうか?
496:デフォルトの名無しさん
07/07/27 20:58:38
エスパー募集中
497:デフォルトの名無しさん
07/07/27 21:44:17
できる
498:デフォルトの名無しさん
07/07/30 12:01:58
jni使わないと、mmx, sseとか使えないんだね。
499:デフォルトの名無しさん
07/07/30 14:34:39
jniの呼び出しオーバーヘッドで、mmxとかのメリット吹き飛ぶ予感
500:デフォルトの名無しさん
07/07/30 19:01:48
それは気にし過ぎ。
2GのファイルとかにMMXするの考えてみて
501:デフォルトの名無しさん
07/07/30 19:09:34
MMX使っても、メソッド呼び出し1回で 2Gのファイル処理しないとペイしないのか。
502:デフォルトの名無しさん
07/07/31 04:49:18
比べる土俵が違うんじゃないか。
例えばMMXはJavaにはない機能なんだが、JNI使用しないとつかえないわけで。
503:デフォルトの名無しさん
07/07/31 05:30:13
いみわからん
504:デフォルトの名無しさん
07/07/31 07:46:43
>>503 おまえは あほか
505:デフォルトの名無しさん
07/07/31 10:43:39
java vmのソースも公開されたことだし、jitコンパイラをハックして
mmx/sse等を使うようにしてみるのも楽しいかもね!
506:デフォルトの名無しさん
07/07/31 12:58:02
>>502
>>504
速く処理を終わらせることが目的なのか、MMXを使うことが目的なのか。
大多数の人にとってはMMXは手段であって目的ではない。
507:デフォルトの名無しさん
07/07/31 14:54:43
>>503 おまえ MMY つかったことないだろ
508:デフォルトの名無しさん
07/08/02 12:00:16
>>506 おまえ MMZ つかったことないだろ
509:デフォルトの名無しさん
07/08/02 19:16:27
JNIの呼び出し、戻しって遅いしね。つかえね~
510:デフォルトの名無しさん
07/08/02 19:50:22
MMWなら使った
511:デフォルトの名無しさん
07/08/02 21:05:37
なんと!
512:デフォルトの名無しさん
07/08/03 08:27:36
JNIのほうではmemcpy相当
Javaのほうではarraycopy相当
で1000万回やったけど、
native.dllのままで、8秒。
native.dllをcl /02 /GDで最適化して5秒。
arraycopy呼び出しは1秒。
JNIの関数呼び出し戻しって遅いよ。
どうにもならないだろうね。
513:デフォルトの名無しさん
07/08/03 09:14:16
関数呼び出し戻しの時間を測定するために、ちょっとDLL作って計ってみた。
public static native long callfunc(long q);
public static long callmeth(long q)
で、引数を何もしないで返すだけ。clは/Ot /GA
100 000 000(1億回)で、
3435 mill
290 mill
およそ10倍。呼び出し回数が異常に多いと、JNIは遅すぎ。
514:デフォルトの名無しさん
07/08/03 09:17:11
ああ、環境は、
windows 2000
jdk 1.6.0.1
cl vc++ 2005
515:デフォルトの名無しさん
07/08/03 11:40:12
JNIコールが遅いってのは、javaプログラマの常識。
呼び出しそのものが遅いってのもあるけど、JNI関数内がJVMからみて不透明なので、
最適化の阻害要因にもなる。
JNI使うのは、JVM経由ではサポートされないプラットフォーム固有のリソースを使うとか、
画像処理なり数値演算なり、CPUパワーに強く依存する処理を大きな単位でC/C++化したりする
ときぐらい。
516:デフォルトの名無しさん
07/08/03 12:55:49
でも呼び戻しが遅いから、その苦労は、相殺される。
517:デフォルトの名無しさん
07/08/03 12:58:40
>>500が言うみたいに、2Gとかのファイル処理じゃないと割に合わんね。
518:デフォルトの名無しさん
07/08/03 13:11:32
JVMでは、スクリプトばかりに日がさしているけど、
JNIが日の目を見るのはいつなのか・・
519:デフォルトの名無しさん
07/08/03 16:09:45
JVM内に取り込めばいいだけの話だろ
オープンソースなんだし
520:デフォルトの名無しさん
07/08/03 16:13:36
JVM内に取り込むって、どーゆー事?
521:デフォルトの名無しさん
07/08/03 16:22:38
>>517
それだけJavaも進化したものだとつくづく思う
522:デフォルトの名無しさん
07/08/04 07:18:12
>>520
JNIなしでネイティブを呼び出す
523:デフォルトの名無しさん
07/08/04 09:43:46
しかし、関数呼び出しがこれほど遅いとはおもわなんだ。
1億回も呼び出すことはないかもしれんが、100万回ぐらいは普通にあるだろ。
in.read()を100万回だと、1Gのファイル処理になるから。
524:デフォルトの名無しさん
07/08/04 09:45:58
100万で1Mファイルだった。
525:デフォルトの名無しさん
07/08/04 12:01:59
>>522
GC管理外にオブジェクト持ち出すための準備はJNIでなくても必要になるだろうし、
JITコンパイラがネイティブコードとJavaのコードを混ぜて最適化ってのも期待できないから
仮にJNIなしでネイティブ呼び出ししても、呼び出しコストが高くなるのは変わらんと思うよ。
期待できるのはJNIって名前が変わる事ぐらいか。
526:デフォルトの名無しさん
07/08/04 12:03:27
んなこたない。
527:デフォルトの名無しさん
07/08/04 12:10:10
>>523-524
そゆこと。
FileInputStream で1バイト読み込みの read() 連発すると滅茶苦茶遅くなるしね。
528:デフォルトの名無しさん
07/08/04 14:06:31
>>527
チマチマやったとしても、実際問題、OSの方でバッファされてるんじゃないか?
529:デフォルトの名無しさん
07/08/04 14:09:29
いや、JNIの呼び出しコストの話
530:デフォルトの名無しさん
07/08/04 14:14:20
>>525
例外を Java側にスローする際の後始末とかもあるし。
531:デフォルトの名無しさん
07/08/04 14:49:16
>>529 そうだった。
532:デフォルトの名無しさん
07/08/04 14:51:07
といっても、実際問題では2Gのファイル読み込むわけではないし、
むちゃくちゃ遅いって事はないだろ。せいぜいjpegで1,2秒まち。
533:デフォルトの名無しさん
07/08/04 14:56:55
べつにJavaじゃ無くても、ファイル読み込みはネイティブでもそれぐらい時間かかるし。
534:デフォルトの名無しさん
07/08/04 15:03:09
ファイル読み込みが遅いって言ってるんじゃなくて、
JNIの呼び出し回数を増やすと遅くなるって話なんだが。
FileInputStream#read() で 1バイトずつ読み込むのと
FileInputStream#read(byte[]) で 1024バイトずつ読むのとを比べたら
後者の方が圧倒的に速い。
535:デフォルトの名無しさん
07/08/04 15:08:15
ああ、わかってる。
ファイル読み込み(IO)は、Javaのアプリじゃなくて、ネイティブのアプリでやっても、
(1M)は1秒ぐらいかかるから、体感では変わらないってことがいいたかっただけ。
JNIはIOでは仕方なく使うことになるけど、
それよりcodecとかzipとかawtで活躍するんだろうと思う。
536:デフォルトの名無しさん
07/08/04 15:20:24
動画用codecとかawtもハードの機能使ったりする可能性考えるとネイティブにせざるを得ないでしょ。
zipも、ブートストラップクラスローダの初期段階では java.util.zipがロードできてない段階で
zipファイルからclassファイルを読み込む必要を考えると、
ネイティブでzlib相当のライブラリを持って無いとダメっぽい。
537:デフォルトの名無しさん
07/08/04 15:26:41
JavaはCより速いから、IO以外の場所でnativeを使う理由はない。
538:デフォルトの名無しさん
07/08/04 15:28:11
よって全てのライブラリは100% pure javaで作成されるべき。
539:デフォルトの名無しさん
07/08/04 15:47:44
>>536
最近はDRMとかあるから、ハードの機能だけじゃないかもしれんな。
540:デフォルトの名無しさん
07/08/04 17:10:30
JNIはJavaより速いかどうかで使う代物ではないな。
Hack専用。高次元技能者専用。したがってシャア専用。
541:デフォルトの名無しさん
07/08/04 17:16:26
JNIなんて仕方なく使うもんだろ?泥臭さの極致。
バッドノウハウ
だな。
542:デフォルトの名無しさん
07/08/04 17:21:42
JAMの登場でそうも言ってられなくなるかもな。
jarやdllを埋め込めるようになるから、準標準VMのごとく
仕様を拡張してくる団体が現れても不思議じゃない。
543:デフォルトの名無しさん
07/08/04 22:47:28
>バッドノウハウ
どういう意味?
>JAMの登場でそうも言ってられなくなるかもな
JNIと関係ないと思うけど。
544:デフォルトの名無しさん
07/08/05 00:21:22
むちゃくちゃ関係あるだろ
545:デフォルトの名無しさん
07/08/05 00:55:50
つかadobe airがあるのに頑張る意味あんの?
546:デフォルトの名無しさん
07/08/05 01:02:35
Apollo自体に頑張る意味がないと思うんだが、それよりなぜJNIスレで?
547:デフォルトの名無しさん
07/08/05 08:49:12
>>541 君はJNIを一生障ることはないだろう
548:デフォルトの名無しさん
07/08/05 09:39:57
>>547
仕方なく使うだろ。
549:デフォルトの名無しさん
07/08/05 13:11:00
>>544 いまいちピンと来ない
550:デフォルトの名無しさん
07/08/05 15:52:33
JNIやると、.dllとか.soも理解しないと実質ダメだから敬遠される。
551:デフォルトの名無しさん
07/08/05 19:05:14
敬遠というか、JNIやるときにはDLLとかSO知らないと組めないことをやるわけだから・・・って書こうと思ったけど、DLL作るにしてもVBとかで手軽に書ければいいんだよな
552:デフォルトの名無しさん
07/08/06 08:43:38
mingwのgccでdllつくってる。clとかもそうだけど、コンパイラが吐くエラーメッセージが意味不明で泣きそうになる。javacの出来は優秀ってことが良く分かる。
553:デフォルトの名無しさん
07/08/06 08:58:16
cのリンク時に出るエラーで関数未定義とかで
どこにあるか分からないケースだと泣きそうになるな
javacも的外れなときはあるし
標準以外の機能を使い始めると
classpathが分からなかったり
色々苦労するよ
554:デフォルトの名無しさん
07/08/06 09:49:40
昔、メモリ搭載が128M程度のときに、1/2だと64M、1/4だと32Mなわけで
なんか身近な容量で実感があったけど、今のメモリ搭載が4Gであって、
1/2で2G、1/4で1Gで、メモリ確保としてやってることは変わらない。
2Gのメモリ確保って大きすぎるって感じはするけど、
当時はbmp,jpeg,mp3程度で10Mのファイルだったが、
今では、ISOファイルで700M、DVDで8Gとかのファイル読み込みになるんだから、
2G,3G程度のメモリ確保は普通にやるでしょ。
555:デフォルトの名無しさん
07/08/06 10:46:37
javaプロセス内で2G以上メモリ確保できるかなー
556:デフォルトの名無しさん
07/08/06 12:38:19
当然JavaVM外。
557:デフォルトの名無しさん
07/08/06 13:11:13
同一プロセス内じゃ無理じゃないかな
558:デフォルトの名無しさん
07/08/08 13:54:06
swigでラッパー自動的に吐き出して実装しようとしてるんすが、CStringとLPCTSTRとか、
各ポインタがSWIGTYPE_p_***となってしまってキャスト方法がわからんのですが、
JAVAでsuperclassとか意識しないでキャストする方法ありますか?
559:デフォルトの名無しさん
07/08/09 13:12:53
何をしたいのかよう分からん。
560:デフォルトの名無しさん
07/11/18 03:07:02
>>489
ここで紹介されているものもJNI並のオーバーヘッドがあるのかな?
だれかベンチとった人いないかな?
たとえ内部でJIN使っているとしても、JINとパフォーマンス的に大差ないなら
バッドノウハウなJINを使うよりずっとよさげだ。
561:560
07/11/18 03:08:39
JINって。。。吊(ry
562:560
07/11/18 03:13:34
ついでに
Javaってスタックオーバーフローとかアウトオブメモリとかでもfinallyブロックの実行保障ってされてるの?
563:デフォルトの名無しさん
07/11/18 04:13:29
StackOverflowError や OutOfMemoryError を特別扱いする記述が
JLSには見当たらないから、他の例外と同レベルに保証されてると考えて良いと思うけど。
ただまぁ、finally節で間接的にでもインスタンス生成した場合
即刻 OutOfMemoryError で死ぬって可能性はある。
564:デフォルトの名無しさん
07/11/18 04:27:18
>>563
.NETだとこれらの非同期例外についてfinallyブロックの実行保障がされてなくって
ネイティブリソースを扱う場合はSafeHandle等を使うわけだけども
JNIではVMがよろしくやってくれちゃうって認識でおk?
565:デフォルトの名無しさん
07/11/18 04:36:46
>>564
JNIが何で出てくるのか判らん
>>563はVM内での話でしょ?
566:デフォルトの名無しさん
07/11/18 04:37:07
SafeHandleみたいな場合は、JNI使う側でなんとかしろって事になると思うけど。
っつか、OutOfMemoryError も StackOverflowError も関係ないね、それ。
567:デフォルトの名無しさん
07/11/18 04:49:44
>>566
JNIの呼び出しでJava側がハンドルを受け取ってまたJNIでそのハンドルを引数にして呼び出したり
ってことはないの?
その際、JNIからJavaへ受け渡す合間に非同期例外が発生してもハンドルを喪失しない保障がないとやばいべ
568:デフォルトの名無しさん
07/11/18 11:41:44
>>567
メソッド呼び出しの際にチェックされるから、
JNI呼び出し前に非同期例外が発生していても問題ない。
JNIメソッド内で非同期例外が出る場合ってのも、
例えば OutOfMemoryError が出る前に、
まず NewObject や New<Type>Array みたいなメソッド呼び出し自体が失敗するから、
失敗した時点でJNIメソッド内で責任を持ってハンドルを解放しないといけない。
自動的にはやってくれない。
569:デフォルトの名無しさん
07/11/18 12:04:19
>>566
っつか、SafeHandle みたいな話なら関係ないのは finally だわな。
オブジェクトを生成して戻り値でハンドルを返すようなメソッド内で
オブジェクト生成したのに非同期例外で中断、戻り値じゃなくて例外飛んできて、
生成したオブジェクトのハンドルが失われてるから
finallyブロックの実行が保障されてても、解放したりの後処理ができねーってのを
防ぐための仕組みでしょ、SafeHandle って。
570:デフォルトの名無しさん
07/11/18 12:38:31
すまん。JNIっていうのに興味あるんだけど、ピアソンエデュケーションの本を
立ち読みしてみたんだけど、いまいちよくわからんのだ。JNIっていうのができると
たとえばどんな事ができるんだい?
571:デフォルトの名無しさん
07/11/18 15:19:24
C言語で書かれたライブラリなどがJavaから使えたりします。
572:デフォルトの名無しさん
07/11/18 15:27:10
>>568
なるほど。
JNIメソッド内でハンドル受け渡しを保障して、finally節実行も保証されているなら問題なさげだね。
>>569
SafeHandleはハンドル取得->代入のアトミック性と
SafeHandle自身がクリーンナップコードをもっていてその実行が保障される仕組み
じゃないっけ?だからfinallyが実行されなくてもリソースの開放が保障される。
finally節の実行保障がないからSafeHandleを使うってことで関係ないってことはなくね?
573:570
07/11/18 23:07:02
>>571 サンクス。なら、Windowsフォームつかって無理やりJNIプログラム作ってみるよ。
ありがとね。
574:デフォルトの名無しさん
08/02/29 02:19:26
C -> Java -> C みたいに変な感じでJNIを使いたいんだけど、
Java -> C のための loadLibrary() でDLLが見つからないんだ。
>>462 みたいなエラーが投げられてるみたいなんだ。
java.library.path で指定した場所にあるDLLなのに。
ちなみに、C -> Java の部分をなしにして、直接javaから
起動すると loadLibrary() できるんだ。
あと、sun.boot.library 上に置いてもうまくいくんだ。
JDK1.5.0_10 + Windows XPなんだけど、誰か何か知らない?
575:デフォルトの名無しさん
08/02/29 22:59:06
>>574
それ解決できないレベルが触らない方がいいものだよJNIは
576:デフォルトの名無しさん
08/03/09 01:39:10
JVMTI でツール作ってる。
JNI 部分(A)+Java 部分(B)と、テスト用の Java ター
ゲットプログラム(C)が用意してある。
起動時に指定されたクラスメソッドに対して
RedefineClass() 使って(B)のクラスのスタティックメ
ソッドを呼び出すバイトコードを inject してる。
で、(C) のクラスを指定すると期待通り動くんだけど、
java のライブラリクラスを指定すると (B) クラスの
NoClassDefFoundError になってしまう。
環境は Linux+JDK5 なんだけどこれってどうして?どう
したらいい?
ちなみに Java 歴一年です。
577:デフォルトの名無しさん
08/03/09 01:56:29
どうしても糞もNoClassDefFoundErrorだろ。
今時JNI使おうって奴はこんなレベルなんかね・・・
578:576
08/03/09 01:59:56
>>577
実行環境は全く一緒、実行するプログラムも引数も全く一緒で、
inject してるバイトコードが参照してるクラスも一緒。
ターゲットプログラムのクラスからは見えるのに
ライブラクラスから見えないのはなんで?
579:デフォルトの名無しさん
08/03/09 02:11:02
クラスローダが違うとか?
580:576
08/03/09 02:40:45
了解。ちょっと調べてみる。
581:576
08/03/09 03:49:36
うーん、ちょっと手を入れてる暇がないなぁ。
当初の目的は果たしたし、とりあえずライブラリ側は
どうしても必要なら後から考える。
> 今時JNI使おうって奴はこんなレベルなんかね・・・
いや、これはもう本当にその通り。
JNI なんて触るより前に知っておくべきことだった。
582:デフォルトの名無しさん
08/07/22 19:57:59
583:デフォルトの名無しさん
08/07/22 20:38:03
TextSS
584:デフォルトの名無しさん
08/08/13 22:30:08
C++からJavaのnativeなメソッドに char* を返したいのだが、
jbyteArrayとかにしないとJava側で受け取れないかな?
char* のままで返せない?
585:デフォルトの名無しさん
08/08/13 22:53:38
>>584
せめて整数型にキャストするとかしないと無理。
586:デフォルトの名無しさん
08/08/13 23:32:29
>>584
っていうか char* を jbyteArray にどうやって変換するの?
587:デフォルトの名無しさん
08/08/13 23:36:45
NewDirectByteBufferという手も
588:デフォルトの名無しさん
08/08/13 23:58:38
そんなことできるんだ
589:デフォルトの名無しさん
08/08/14 00:01:29
>>587
馬鹿なおいらに具体的なサンプルコード書いてください、仏様。
590:デフォルトの名無しさん
08/08/14 01:26:18
こんな感じ?
#include <jni.h>
JNIEXPORT jobject JNICALL Java_Goodbye_getGoodbye(JNIEnv *env, jclass clazz) {
return (*env)->NewDirectByteBuffer(env, "goodbye", 7);
}
import java.nio.*;
public class Goodbye {
public static void main(String[] args) {
System.loadLibrary("goodbye");
ByteBuffer buffer = getGoodbye();
byte[] b = new byte[buffer.remaining()];
buffer.get(b);
System.out.println(new String(b));
}
private static native ByteBuffer getGoodbye();
}
591:デフォルトの名無しさん
08/08/14 08:30:15
>>590
NewDirectByteBuffer って読み書き両用にしかできないと思ったが、
C/C++ の文字列リテラルって書き込みして良いんだっけか?
592:デフォルトの名無しさん
08/08/14 09:27:52
え、read onlyのdirect bufferって作れないの
593:デフォルトの名無しさん
08/08/14 09:46:01
asReadOnlyBuffer() すりゃ読み込み専用にできるけど、
NewDirectByteBuffer した直後は書き込めるよね。
594:デフォルトの名無しさん
08/08/14 09:51:42
あぁ、asReadOnlyBuffer しても読み込み専用のビュー返すだけで
NewDirectByteBuffer で作成したバッファ自体が読み込み専用になるわけじゃないんで。
595:デフォルトの名無しさん
08/08/14 10:10:12
>>590だけならNewStringとかNewStringUTFした方が楽じゃね
NewDirectByteBufferに自前で確保したメモリ渡す時って
誰がどのタイミングでメモリ解放すりゃいいんだか良くわからんし
メモリ解放用のコールバック関数渡すわけでもないみたいだし
NewDirectByteBufferってメモリマップドI/Oみたいな
解放の必要がないアドレス渡すためにあるんじゃ
596:590
08/08/14 12:11:38
サンプル欲しいっていうから書いただけなんだからねっ
使い方に問題あるのは百も承知
>>595
一度放ったByteBufferを無効に出来ないってのがネックなんだよな
参照が切れてGCに回収されるのをWeakReferenceで待ってから解放するしかない
597:デフォルトの名無しさん
08/08/16 21:24:14
問題の少ない使い方するために記述容易性なくなるんなら
素直に byte[] とか使った方が早いんじゃねーかと思わなくも無い。
598:デフォルトの名無しさん
08/08/17 11:27:03
>>598
URLリンク(imepita.jp)