我目前正在 Android Studio 中创建一个项目,该项目使用 JNA 调用原生C ++库。
我按照此处的说明操作:https://github.com/java-native-access/jna,
我从https://github.com/java-native-access/jna/tree/master/lib/native/android-x86-64.jar下载了 libjnidispatch.so ,
我将 jna.jar 库添加到我的Android Studio项目
我解压缩了 libjnidispatch.so 库,将其放入我的 jniLibs 目录 x86_64 文件夹中,
我调用了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;
我像这样编译它(在linux上显示gcc):
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:
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 库位于同一路径中。
到目前为止,我被困住了。是否有人设法使android工作室与JNA和自定义C ++库一起工作。
非常感谢你。
答案 0 :(得分:0)
用于构建库的命令gcc -shared -o .so foo.o
将其编译为名为&#34; .so&#34;的文件,改为尝试gcc -shared -o libfoo.so foo.o
。
答案 1 :(得分:0)
目前尚不清楚JNA是否适用于Android。 Samuel Audet(javaCV的作者)试图将其移植一次,但该补丁并未包含在官方JNA主干中。还有一个版本online(您可以查看)。您可以阅读详细信息here ... 有一个讨论: https://code.google.com/p/android/issues/detail?id=11099 最后他们建议使用JavaCPP。