【发布时间】:2011-11-12 01:24:31
【问题描述】:
请帮助我搜索整个互联网,但我找不到答案......
C层
我创建了简单的函数int mean(int, int); 并将其放在calc_mean.h 中并在calc_mean.c 中对其进行初始化,这是这两个文件。
calc_mean.c
#include "calc_mean.h"
int mean(int a, int b)
{
return (a+b) / 2;
}
calc_mean.h
int mean(int, int);
然后我使用以下 make 文件创建 make 文件并构建名为 Test_Archive.a 的归档 (.a) 文件
制作文件
GCC := C:\Tools\ndk-toolchain\ndk-standalone\bin\arm-linux-androideabi-gcc.exe
GPP := C:\Tools\ndk-toolchain\ndk-standalone\bin\arm-linux-androideabi-g++.exe
AR := C:\Tools\ndk-toolchain\ndk-standalone\bin\arm-linux-androideabi-ar.exe
default: all
all: obj
$(AR) r Test_Archive.a *.o
obj:
$(GPP) -c *.c
我得到 Test_Archive.a 存档文件。现在我想将此存档文件添加到 JNI 并从我的 JNI 项目中调用 mean 函数,因为我已经创建了 JNI 和 Java 文件,您可以在下面看到。
JAVA 层
如何在 java 层中看到我有 TestJavaClass,它有一个名为 JMean 的本机方法,此方法有两个 int 参数并返回 int。
public class TestJavaClass
{
/** Default Constructor
*
*/
public TestJavaClass( ) {
}
/** Test Function.
*
* @param a
* @param b
* @return
*/
public native int JMean( int a, int b);
}
JNI 层
这是JNI头文件
Test_Library.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_Fido_OSTXLib_OSTX */
#ifndef _Included_com_Fido_OSTXLib_OSTX
#define _Included_com_Fido_OSTXLib_OSTX
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_Fido_OSTXLib_OSTX
* Method: JMean
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_Fido_OSTXLib_OSTX_JMean
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
Test_Library.c
#include "Test_Library.h"
#include "calc_mean.h"
JNIEXPORT jint JNICALL Java_com_Fido_OSTXLib_OSTX_JMean( JNIEnv* env, jobject thiz, jint a, jint b )
{
return mean( a, b );
}
我把这两个文件Test_Library.h、Test_Library.c和calc_mean.h、Test_Archive.a > 并创建 make 文件 Android.mk
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Test_Library
LOCAL_SRC_FILES := Test_Library.c
LOCAL_LDLIBS := -LTest_Archive.a
include $(BUILD_SHARED_LIBRARY)
但是当我想创建.so文件时,出现如下错误,为什么?
$ ../../ndk-build 编译拇指:Test_Library Java_com_Fido_OSTXLib_OSTX_JMean': C:/cygwin/home/android-ndk-r5b/Fido/ProjectOSTX/jni/OSTX_Library.c:6: undefined reference tomean' collect2: ld 返回 1 退出状态 make: * [/home/android-ndk-r5b/Fido/ProjectOSTX/obj/local/armeabi/libOSTX_Library.so] 错误 1
为什么未定义对 `mean' 的引用?
【问题讨论】:
-
你也不必在 Test_Library.c 中
#include "Test_Library.h"吗? -
不,你能告诉我NDK gcc编译器在哪里吗?
-
我认为,您必须在本机代码中包含使用
javah创建的头文件。 -
我已将它包含到 Test_Library.c
-
这是同样的问题,没有答案check this
标签: android static shared android-ndk