使用现有的C代码文件在Android中构建,并将信息从java代码传递到C代码

使用现有的C代码文件在Android中构建,并将信息从java代码传递到C代码,java,android,c,android-ndk,java-native-interface,Java,Android,C,Android Ndk,Java Native Interface,我知道我需要考虑使用NDK和JNI来集成这两个C和Java,但是所有教程似乎都指向编写自己的C代码。我得到了一个巨大的目录,其中包括.C文件和相应的.H文件。这个C代码是由MatLab生成的。请记住,我是一名Java开发人员,我的C知识不是很好。在这个目录中有2.mk文件和一些其他文件类型以及.bat.rsp等等,总共有360个文件。我需要构建这个实现,能够将信息传递给一些函数,并接收返回的信息。我需要遵循什么过程来实现这一点,因为在线信息涉及创建头文件等。。但是C中的头文件已经存在了吗?我认为

我知道我需要考虑使用NDK和JNI来集成这两个C和Java,但是所有教程似乎都指向编写自己的C代码。我得到了一个巨大的目录,其中包括.C文件和相应的.H文件。这个C代码是由MatLab生成的。请记住,我是一名Java开发人员,我的C知识不是很好。在这个目录中有2.mk文件和一些其他文件类型以及.bat.rsp等等,总共有360个文件。我需要构建这个实现,能够将信息传递给一些函数,并接收返回的信息。我需要遵循什么过程来实现这一点,因为在线信息涉及创建头文件等。。但是C中的头文件已经存在了吗?我认为我最重要的问题是如何集成并构建它,以便使用JNI与C代码交互

我希望这是有道理的,请让我知道,如果你需要任何澄清。C应用程序只需接受我的输入并进行一些数学运算,然后为我提供一个输出对象,其中包含我需要的数据


如果可以,请提供帮助。

您的策略如下:

  • 使用本机C/C++代码支持创建Android项目,例如,如下所示:。您的目标是创建以下链:

    [Your Android Java app] --> [JNI Java API] --> [JNI native] --> [MatLab native]
    
    JNI只是将Java调用封送到目标MatLab函数

  • 仅为您真正需要的Matlab函数生成C代码。检查文档():

    您不必为整个MATLAB应用程序生成代码。如果您有计算密集型的特定部分,请从这些部分生成代码以加快算法。 使代码适合于代码生成

  • 使用自己设计的方法生成JNI:例如,您将拥有
    MatLabJniApi.java
    (JNIJavaAPI),并且您将获得
    com\u-MatLabJniApi.c
    (以及
    com\u-MatLabJniApi.h
    )作为
    javac-h的结果。java
    命令(JNI本机实现)

  • 最后,从生成的JNI原生C/C++文件调用MatLab函数:

    #include <matlab_header_with_foobar.h>
    ...
    JNIEXPORT void JNICALL Java_com_your_MatLabJniApi_foobar (JNIEnv* env, jobject thisObject) {
       ...
       foobar_from_matlab();
       ...
    }
    

    您希望从Java调用的C函数必须命名(除非您使用
    注册表项
    )。JDK中有一些工具可以基于Java代码中的
    native
    方法声明创建具有正确命名的C函数声明的头。然后由您来编写C函数定义。或者你可能会考虑使用类似SWIG的东西,它可以为你做一些事情,但另一方面,你需要学习如何使用SWIG。@Michael感谢你花时间提供帮助,我从中得到的是,我需要将java中的方法声明为本机方法,然后使用这些工具创建新的头文件。所以我不使用C目录中已有的?请原谅我的愚蠢,但为什么我必须重新编写C函数?我又把所有的东西都写出来了吗?我不直接与现有的C代码交互吗?如果我把事情弄糊涂了,我道歉!在此之前,我需要创建一个Android.mk文件来构建现有的C代码?我读了很多书,但是使这个用法具体化似乎很困难。通常你现有的C函数不会遵循JNI命名约定。假设您有一个名为
    foo
    的C函数,并且在Java类
    com.mycompany.MyClass
    中将其声明为
    native
    方法。然后您将编写另一个名为
    Java\u com\u mycompany\u MyClass\u foo
    的C函数,它调用实际的
    foo
    函数,并转换/传递函数参数和返回值。所以你没有重新实现所有的C函数;您只是在希望能够调用的函数周围添加了一些包装。在开始在Android上使用它之前,您可以先将代码与“桌面Java”接口通过使用常规JNI。@Michael,为了确认我编写的这个新C函数不是原始C函数的副本,它只是一个接受参数并调用原始C函数的函数,仅此而已。因此,我最终使用原始Java类和函数,该函数将数据传递给我的新C函数,该函数只接受数据并将其提供给原来的C函数!我假设在新的C函数中,JNi与JLong等的使用是在哪里实现的?仍然需要找到一种方法来构建原始的C库,使其在Android中工作,我想这也是令人困惑的!谢谢你的解释,我今天要试一试。只是一个快速的查询,我对MatLab代码没有真正的了解,这是一家第三方公司提供的。在不知道如何构建的情况下,我是否有机会为此编写一个Android.mk文件?我只是想在我开始战斗之前问一下,我赢不了!再次感谢您的帮助。是的,这并不可怕,作为第一步,请尝试将所有*.c文件放入
    LOCAL\u SRC\u文件中并尝试构建。当然会出问题的。不管怎么说,请阅读这篇文章或这篇文章,即使它不是您的代码,也请尝试识别您实际上要调用的那些函数。缩小范围就行了。想想JNI,它会是什么样子。您只需将Android.mk放入带有源代码的文件夹中,并在其中定义一个静态库模块,然后使用
    ndk build
    进行构建,这样您就会看到任何问题。我不能预测所有的问题,但要一步一步地解决,因为我只需要向10个函数传递数据,并且只有一个函数返回一个响应对象。所以我希望我今天能取得进步。你失去了我的静态库模块,这真的超出了我的舒适区!但我会看看我今天能走多远。非常感谢你的帮助。谢谢。我会在我的答案中加入示例Android.mk
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := mymatlab         # Name of your module
    LOCAL_SRC_FILES := 1.c 2.c 3.c   # Sources, and here you can try $(wildcard *.c)
    include $(BUILD_STATIC_LIBRARY)  # This means to build libmymatlab.a