那是因为,如果源文件是c的话,默认所有导出函数都隐含加了extern "C"的属性
你在CPP里使用那些函数,应该需要在声明里加上extern "c"属性的,否则链接器会按CPP方式去查找函数,这当然是找不到的
按理说开源工程一般都会做得比较细心才对啊,你看一下它的头文件,一般在开头都会有类似下面的代码,包括windows的头文件,全部都会有的
#ifdef __cplusplus
extern "C" {
#endif
xxxxxx函数声明
#ifdef __cplusplus
}
#endif
出现你那种情况,大概是函数的声明是你自己把函数名复制过去的吧,没有用开源工程提供的头文件;
解决也简单,如果开源工程有提供头文件,那么就用它提供的头文件;如果没有,那么在你声明的地方加上我上面的代码
楼上说的很对,我在用java NDK 开发也是这样的问题,但是一样是用extern "C" 搞定,
贴段代码给你看看
#include
#include
#include
#include
#include
extern "C"
{
void Java_com_example_jniopengl_MainActivity_go(JNIEnv* env,jobject thiz);
}
void *run_by_thread(void *num)
{
int *nums=(int*)num;
int status=0;
for(int i=0;i<3;i++)
{
::sleep(1);
::__android_log_print(1,"go++","thread %d:_%d",*nums,i);
}
if(*nums==1)
{ status=100;
return (void*)&status;
}
else if(*nums==2)
{
status=200;
::pthread_exit((void*)&status);
}
}
void start_threads()
{
pthread_t th1,th2;
int threadNum1=1;
int threadNum2=2;
int ret=-1;
int re=::pthread_create(&th1,NULL,run_by_thread,(void*)&threadNum1);
re=::pthread_create(&th2,NULL,run_by_thread,(void*)&threadNum2);
void*status;
re=::pthread_join(th1,&status);
int *code=(int *)status;
__android_log_print(1,"code","code:%d\n",*code);
re=::pthread_join(th2,&status);
int *code2=(int *)status;
__android_log_print(1,"code","code:%d\n",*code2);
}
void Java_com_example_jniopengl_MainActivity_go(JNIEnv* env,jobject thiz)
{
start_threads();
}