在Android Studio上使用自己的JNA库

时间:2016-04-22 09:16:12

标签: android c++ c java-native-interface jna

我目前正在 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 ++库一起工作。

非常感谢你。

2 个答案:

答案 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