当前位置: 首页 > 知识库问答 >
问题:

在Android Studio上使用自己的JNA库

凌琦
2023-03-14

我目前正在Android Studio中创建一个使用JNA调用原生C++库的项目。

我按照下面的说明进行了操作:https://github.com/java-native-access/jna,

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 -c -Wall -Werror -fPIC foo.c
gcc -shared -o foo.so foo.o
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();
    }
}
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 (.)

提前非常感谢。

共有1个答案

茅鸿宝
2023-03-14

用于构建库的命令gcc-shared-o.so foo.o将其编译为一个名为“.so”的文件,请尝试gcc-shared-o libfoo.so foo.o

 类似资料:
  • 我想做一个应用程序,使用谷歌翻译API。自从我添加了 我的构建中的依赖项。gradle我有个错误: 现在必须显式声明注释处理器。发现编译类路径上的以下依赖项包含注释处理器。请将它们添加到annotationProcessor配置中。-自动值-1.2。jar(com.google.auto.value:auto-value:1.2)或者,设置android。defaultConfig。javaCom

  • 我有一个python应用程序要测试。此应用程序正在导入许多包,例如: 其中mypackage是我自己的包。 当我开始应用程序时,一切正常。然而,一旦我试图运行毒物测试它,我就会得到以下错误: 我知道tox无法安装mypackage依赖项,因为它不在pip中。您知道如何在此类应用程序上运行tox,或者如何使用tox安装自己的软件包吗? 我的tox.ini文件内容:

  • 我如何像这样使用我的电子邮件example@domain.ph在phpmailer中。因为我总是有一个错误,即使我有一个正确的凭据。 2020-05-14 09:21:24服务器- 这是我的配置:

  • 我试图在我自己的包中使用data.table包。MWE如下:

  • java-jar C:\users\rash\desktop\selenium\selenium jars\selenium-server-standalone-2.39.0.jar-port 4444-role hub-nodetimeout 600 对于上面的所有命令,它都给出了一个消息“无法访问jar文件”。

  • 目前,我正试图使用JNA将非Java应用程序设置为焦点,我发现了以下代码。 我还将以下依赖项放入我的pom.xml,该项目是一个只有主文件的新项目。 这是我们的程序入口点: 理论上,在编译/运行时,程序应该只关注运行时打开的谷歌Chrome。 然而,Java给出了以下错误消息: 对于这个问题,我找到的唯一参考是使用JNA User32平台映射的NoSuchMethodError 这几乎是相同的错误