Я в настоящее время создаю проект в 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++.
Благодарим вас за это заранее.
Выполнить с системным свойством 'jna.debug_load = true' и JNA будет выводить отладочную информацию о том, где она ищет вашу библиотеку. – technomage
Не могли бы вы указать, где эти параметры находятся в Android Studio? – Lud23
Я думаю, Allready делается Я проверил мой файл ** studio64.vmoptions **, и у меня есть: '-Djna.debug_load = истинный -Djna.debug_load.jna = true' – Lud23