使用现有的C代码文件在Android中构建,并将信息从java代码传递到C代码
我知道我需要考虑使用NDK和JNI来集成这两个C和Java,但是所有教程似乎都指向编写自己的C代码。我得到了一个巨大的目录,其中包括.C文件和相应的.H文件。这个C代码是由MatLab生成的。请记住,我是一名Java开发人员,我的C知识不是很好。在这个目录中有2.mk文件和一些其他文件类型以及.bat.rsp等等,总共有360个文件。我需要构建这个实现,能够将信息传递给一些函数,并接收返回的信息。我需要遵循什么过程来实现这一点,因为在线信息涉及创建头文件等。。但是C中的头文件已经存在了吗?我认为我最重要的问题是如何集成并构建它,以便使用JNI与C代码交互 我希望这是有道理的,请让我知道,如果你需要任何澄清。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中的头文件已经存在了吗?我认为
如果可以,请提供帮助。您的策略如下:
[Your Android Java app] --> [JNI Java API] --> [JNI native] --> [MatLab native]
JNI只是将Java调用封送到目标MatLab函数MatLabJniApi.java
(JNIJavaAPI),并且您将获得com\u-MatLabJniApi.c
(以及com\u-MatLabJniApi.h
)作为javac-h的结果。java
命令(JNI本机实现)#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