2016-04-22 40 views
1

我目前在Android Studio中創建了一個項目,它使用JNA調用Native C++庫。在Android Studio上使用JNA自帶的庫

我按照說明在這裏:https://github.com/java-native-access/jna

我下載了libjnidispatch.sohttps://github.com/java-native-access/jna/tree/master/lib/native/android-x86-64.jar

我加入了jna.jar庫到Android Studio項目,

我提取了libjnidispatch.so庫將其放入文件夾x86_64 on我jniLibs目錄,

我叫printf()函數,

public interface CLibrary extends Library 
{ 
    //---libjnidispatch--- 
    void printf(String format, Object... args); 
} 
... 
    CLibrary demo = (CLibrary) Native.loadLibrary("c", CLibrary.class); 
    demo.prinft("Hello JNA !"); 
... 

它成功運行。

Hello JNA ! 

然後,我想用我自己的庫。

我裝同樣的方式是這樣的:

#include <stdio.h> 

int somme(int a, int b) 
    return a+b; 

我編譯它像這樣(顯示GCC在Linux這裏):

gcc -c -Wall -Werror -fPIC foo.c 
gcc -shared -o foo.so foo.o 

的Java:

package com.example.guest.essai2; 

     import com.sun.jna.Library; 
     import com.sun.jna.Native; 
     import com.sun.jna.Platform; 

     import android.*; 
     import com.google.android.*; 

public class MainActivity extends AppCompatActivity { 

    private GoogleApiClient client; 

    //--------------JNA---------------------- 
    public interface Foo extends Library 
    { 
     //--foo---- 
     int somme(int a, int b); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     TextView tv = new TextView(this); 

     System.setProperty("jna.library.path", "/home/guest/workspace/MyApplication/Essai2/app/src/main/jniLibs/x86_64/"); 
     NativeLibrary.addSearchPath("foo", "/home/guest/workspace/MyApplication/Essai2/app/src/main/jniLibs/x86_64/"); 
     Native.register(Foo.class,"foo"); 

     Foo foo = (Foo) Native.loadLibrary("foo", Foo.class); 

     String msg = ""+foo.somme(2,3); 
     tv.setText(msg); 
     setContentView(tv); 
     client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); 
    } 
} 

但它不工作。

然後我試圖改變與severals企圖jna.library.path:每次

System.setProperty("jna.library.path", "/home/guest/workspace/MyApplication/Essai2/app/src/main/jniLibs/x86_64/"); 

NativeLibrary.addSearchPath("foo", "/home/guest/workspace/MyApplication/Essai2/app/src/main/jniLibs/x86_64/"); 

Native.register(Foo.class,"foo"); 

但是,我得到了以下錯誤:

java.lang.UnsatisfiedLinkError: Unable to load library 'foo': Native library (android-x86-64/libfoo.so) not found in resource path (.) 

儘管有事實libfoo.solibjnidispatch.so庫處於相同路徑。

到目前爲止,我卡住了。有沒有人設法使android studio與JNA和定製的C++庫一起工作。

非常感謝您提前。

+0

使用系統屬性'jna.debug_load = true'運行,JNA將發出關於它在哪裏查找庫的調試信息。 – technomage

+0

您能否指出我在Android Studio中的選項? – Lud23

+0

我認爲,媒體鏈接做 我檢查了我的文件** ** studio64.vmoptions,我有: '-Djna.debug_load =真 -Djna.debug_load.jna = TRUE; – Lud23

回答

0

您用於構建庫的命令gcc -shared -o .so foo.o將它編譯爲名爲「.so」的文件,而是嘗試使用gcc -shared -o libfoo.so foo.o

+0

對不起,我在第一條消息中忽略了它(我糾正了它)。 – Lud23

+0

@ Lud23將'libfoo.so'放在'android-x86-64'目錄下嗎? – fluter

+0

但是類加載器試圖在'android-x86-64/libfoo.so'上搜索它。所以您需要將該路徑添加到搜索路徑。 – fluter

0

目前尚不清楚JNA是否在android上工作。 Samuel Audet(javaCV的作者)試圖將其移植一次,但補丁未包含在官方JNA中。還有一個版本online(你可以查看)。您可以閱讀詳細信息here ... 有一個關於它的討論: https://code.google.com/p/android/issues/detail?id=11099 最後他們建議使用JavaCPP

+0

非常感謝,我開始絕望。 我會按照你的建議,並嘗試JavaCPP! – Lud23