Пожалуйста, помогите мне выполнить поиск, бросьте весь интернет, но я не могу найти ответ ...
Слой
Я создал простую функцию 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 и файл архива сборки (.a) с именем Test_Archive.a, используя следующий файл make
makefile
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 и вызвать функцию mean
из моего проекта JNI, для этого я создал файлы 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 <= Test_Library.c SharedLibrary: libTest_Library.so C: / cygwin / home / android-ndk-r5b / Fido / ProjectOSTX / obj/local/armeabi/objs/OSTX_Library/OSTX_Library.o: в функции <code>Java_com_Fido_OSTXLib_OSTX_JMean':
C:/cygwin/home/android-ndk-r5b/Fido/ProjectOSTX/jni/OSTX_Library.c:6:
undefined reference to mean 'collect2: ld вернул 1 состояние выхода make: * [/ home / android-ndk-r5b / Fido / ProjectOSTX /объект / местные / armeabi /libOSTX_Library.so] Ошибка 1
Почему неопределенная ссылка на `mean '?