Quisiera saber la diferencia entre un archivo con extensión .c y uno .cpp, pues leí que cuando en el archivo .h que genero a través de JNI se tiene un extern "C" tiene que ver con el compilador de C o algo así y quizás por ehi este la solución a mi problema al hacer link, pero como le digo soy nueva programando con C y a pesar de que mi trabajo original es en JAVA necesito hacer el wrapper de JNI en C pues los driver del scanner que deseo conectar están implementados en C
Habitualmente la diferencia en la extensión (.cpp o .c), define el tipo de código que hay escrito. Así si los fichero tienen extensión .cpp los compiladores compilaran su contenido de acuerdo a las gramática y sintaxis de C++, mientras que los archivos con extensión .c los compiladores usarán la de C. La diferencia no solo se haya en que se use una gramática u otra, si no que además C++ cuando compila una función en el fichero .obj su nombre es alterado de una manera distinta a como lo hace C. Te pongo un ejemplo. Si en un fichero .cpp tu defines la siguiente función: void MiFuncion(void *,unsigned long) la función en el fichero .obj tiene como nombre: __imp_?MiFuncion@@YGXPAXK@Z. Mientras que si tu declaras la misma función en un fichero con extensión .c, dicha función aparecerá en el fichero .obj como: _MiFuncion Resulta que los archivos de cabecera (los de extensión .h) se utilizan para declarar las funciones tanto para ficheros de C como de C++. Así que si tu tienes en el fichero de cabecera la declaración de la función anterior, de la siguiente manera: void MiFuncion(void *,unsigned long); Si la función que has declarado en ese fichero MiFuncion. H se implementa por ejemplo en el fichero MiFuncion.cpp y se usa en el fichero Código.cpp Cuando el linker las resuelva no vas a tener ningún problema. Ambas están escritas en C++ y tendrán ese nombre raro, que por cierto se llama mangling. Pero si en otro caso la función que has declarado en ese fichero MiFuncion. H se implementa por ejemplo en el fichero MiFuncion.c y se usa en el fichero Código.cpp Cuando el linker las resuelva va a dar el siguiente error: unresolved external symbol "__declspec(dllimport) void __stdcall __imp_?MiFuncion@@YGXPAXK@Z Por que en el fichero Código. Obj la función a buscar va a buscar se llama así (__imp_?MiFuncion@@YGXPAXK@Z), mientras que la función que realmente existe en MiFunción.obj se llama _MiFuncion. Para ello, se le indica en el fichero .cpp que dicha función no está generada con la regla de C++, si no con las reglas de C. Eso se hace con la directiva extern "C". Y se pone en el fichero que se compila en C++ pero va a usar funciones escritas en C. Lo que puede pasar, es que habitualmente las funciones escritas por los fabricantes de librerías, están casi siempre escritas en C. Con lo cual a la hora de usarlas se pueden usar tanto en C, como en C++. En los ficheros y programas hechos en C++, se añade la directiva extern "C" de la siguiente manera: extern "C" { #include "fichero.h" } Indicando que todas las funciones de ese fichero están escritas en C, y no se deben de buscar con la sintaxis de C++.