2016-04-22 5 views
1

Я в настоящее время создаю проект в Android Studio, который вызывает родную библиотеку C++, используя JNA.Используйте свою собственную библиотеку с JNA на Android Studio

Я следовал инструкциям здесь: https://github.com/java-native-access/jna,

Я скачал libjnidispatch.so из https://github.com/java-native-access/jna/tree/master/lib/native/android-x86-64.jar,

Я добавил библиотеку jna.jar к моему проекту Android-студия,

Я извлек библиотеку libjnidispatch.so, чтобы поместить ее в папку x86_6 мои jniLibs каталог,

Я называется функцией Е(),

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(); 
    } 
} 

Но это не работает.

Затем я попытался изменить jna.library.path с severals попыток:

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.so и библиотеки libjnidispatch.so находятся на одном пути.

До сих пор я застрял. Есть ли кто-то, кто смог сделать работу в андроид-студии с помощью JNA и пользовательской библиотеки C++.

Благодарим вас за это заранее.

+0

Выполнить с системным свойством 'jna.debug_load = true' и JNA будет выводить отладочную информацию о том, где она ищет вашу библиотеку. – technomage

+0

Не могли бы вы указать, где эти параметры находятся в Android Studio? – Lud23

+0

Я думаю, Allready делается Я проверил мой файл ** 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 на андроиде вообще. Самюэль Аудит (автор javaCV) попытался его перенести, однако патч не был включен в официальный JNA-багажник. Существует еще версия online (которую вы можете проверить). Вы можете прочитать подробности here ... И есть обсуждение: https://code.google.com/p/android/issues/detail?id=11099 В конце концов они предлагают использовать JavaCPP.

+0

Большое спасибо, я начинал отчаиваться. Я буду следовать вашим предложениям и попробовать JavaCPP! – Lud23