2012-02-18 3 views
0

私は、JVMを組み込んだCアプリケーション(G-WAN)のAPIをエクスポートするためにJNIラッパーを作成しました。ネイティブコールはであり、Cアプリケーションでが実装され、RegisterNatives()でエクスポートされます。独自のクラス/名前空間のJNIネイティブコール*プロトタイプ*

は、理想的には私はG-WANのAPIは「gwan」クラスを持っているでしょう:

import gwan // G-WAN API 

public class hello { 
    public static int jmain(long env, String[] args) { 
     gwan.xbuf_cat(gwan.get_reply(env), "Hello World"); 
     return 200; // HTTP status (200:'OK') 
    } 
} 

は、私は上記のプロトタイプネイティブコールをインポートする「の#import gwan」のような何かをしたいと思い、しかし、現在は私しかいない(働く)以下:再び

public class hello { 
    public static int jmain(long env, String[] args) { 
     gwan_xbuf_cat(gwan_get_reply(env), "Hello World"); 
     return 200; // HTTP status (200:'OK') 
    } 
    public static native long gwan_get_reply(long env); 
    public static native void gwan_xbuf_cat(long ctx, String str); 
} 

実装(ないディスクに格納されているJavaクラスの)G-WANの実行で行われたのネイティブ呼び出しの

the G-WAN API is quite largeのため、可能であれば(上記の最初のhelloの例のように)独自の 'gwan'クラス(または名前空間)でネイティブ呼び出しプロトタイプを使用したいと思います。

これを行う方法についてのご意見はありますか? (私はJavaの専門家ではないので、JavaまたはJNIコードを投稿してください)

Disclamer:私はこのプロジェクトの開発に携わっています。

答えて

2

はCプログラマなので、私はJavaは、ドットの代わりにスラッシュとクラス(パス)名を再マッピングすることを見つけるために、JVMのCのソースコードを読むために持っていました。

リスナーと仮想ホスト(192.168.10.10_80/#domain.com/csp)を定義するためにG-WANディレクトリ階層がIPアドレスを使用するため、これらのドットはFindClass() JNIコールを混乱させ、クラスを見つけることができませんでした。

また、クラスパスの区切り文字は、Unixでは ":"、 " Windowsの場合それは私の問題の原因ではありませんでしたが、同じ問題を引き起こす可能性があります。

最後に、GCJコンパイラのJVMは、doubles(少なくとも2006年以降)の形式化をサポートしていないため、使用を中止しました。 OpenJDKまたはSUN/ORACLE JVMのいずれかを使用すると、正常に動作します。

すべて正常に動作します。他の人を助けるかもしれない場合に備えて、私はこのすべてをここに掲載します。

2

私は、Oracle
http://java.sun.com/docs/books/jni/html/jniTOC.html

その後、それは理解できるはずですが、いくつかの擬似コードとそのテストされていませんが、独自に呼び出すgwanapi 2を移動させることであろう今日からJNIで次の論文を読むことを示唆していますgwanapi.java

public class gwanapi { 
public static native long get_reply(long answer); 
public static native void xbuf_cat(long ctx,String str); 
} 

という名前のファイルあなたはjavac gwanapi.javaでそのファイルをコンパイル - >出力:あなたは、C/C++ヘッダーの実装のためのjavah -jniを入力し gwanapi.class:

あなたのハローJavaクラスの
javah -jni gwanapi 

あなたがすべき次の擬似コードとNOT

public class hello{ 
    static{ 
     System.loadLibrary("gwanapi"); 
    } 
    public static int jmain(long env,String args[]){ 
     gwanapi.xbuf_cat(gwanapi.get_reply(env),"Hello World!"); 
     return 200; 
    } 
} 

をテストし、あなたが行くために良いことがありstatic{ System.loadLibrary("gwanapi");}

を呼び出すことです。

しかし、私は1つか2つ見逃しているかもしれませんが、これはあなたがすべき仕事の最小量だと思います。

ああ、ところでhttp://en.wikipedia.org/wiki/Java_Native_Interfaceは、JNIコールのソースの一種であり、どのように動作し、より多くの情報でより多くのサイトにつながりますか。

おかげ

+0

私はその文書(および他の多くの文書)を読みました。私はすでにそれを試しました。同じ結果につながります(「エラー:グワナピは解決できません」)。私も同じパッケージを定義しようとしました(同じエラーで)。とにかく試してくれてありがとう(私はあなたに関連情報を書いている時間のポイントをくれた)。 – Gil