2017-03-25 12 views
1

を使用して.cppファイル内のネイティブメソッドを呼び出すことができませんでした。my javaプログラムは、ライブラリ.dllが正常にロードされる.cppファイルのネイティブメソッドを呼び出すことも、呼び出すこともできませんプログラム。 が実行中に例外java.lang.UnsatisfiedLinkErrorがスローされます。 プロジェクトへのライブラリパスを正しく設定しました。ここJava:java.lang.UnsatisfiedLinkError JNI

は私のcppファイルです:

package demojni; 

public class Jni1{ 
    private native int printm(); 
    static{ 
     try{ 
     System.out.println(System.getProperty("java.library.path")); 
     System.loadLibrary("libCppJNILibrary_1"); 
     System.out.println("loaded"); 
     } 
     catch(Exception e){ 
     System.out.println("can't load\n"+e.getMessage()); 
     } 
    } 

    public static void main(String[] arg){ 
     Jni1 api=new Jni1(); 
     int a=api.printm(); 
    } 
} 
+0

なぜ '_Java_demojni_Demojni_printm'の先頭にアンダースコアがありますか?また、ネイティブコードで指定したクラス名は 'Demojni'ですが、Javaコードでは' Jni1'です。 – Michael

+0

私は間違いを抱きました –

答えて

0

は、メソッド名とパッケージ名と一致することを確認します:

#include "jni.h" 
#include "Demojni.h" 
#include <iostream> 
using namespace std; 

extern "c"{ 
    JNIEXPORT jint JNICALL _Java_demojni_Demojni_printm(JNIEnv *env, jobject object){ 
     cout<<"call from c++"; 
     return 1; 
    } 
} 

int main(){ 
    return 1; 
} 

、ここでは、.javaファイルです。

はこちらをご覧ください:

http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/design.html

章:実際には "ネイティブメソッド名の解決"

を、すべてが正しくセットアップされているためにeasiesの方法は、javahはを使用することです。

こんにちは、単純な世界のサンプルを見てみましょう:

http://jnicookbook.owsiak.org/recipe-No-001/

+0

リンク先に感謝 –

0

をあなたがおよび/またはJNIの名前を調整することなく、.hファイルを再生せずにDemoJNI1からJni1にクラスの名前を変更メソッドを.cファイルに追加します。

+0

はい私はその訂正をしました –

+0

あなたはあなたが有用であると答え、最も有用なものを受け入れることをupvoting検討する必要があります。 – EJP