[Cpp -> Java] Linken gaat niet goed :(

Pagina: 1
Acties:

  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 28-01 13:50
Ok, ben dus een beetje aan het stoeien met JNI, nu wil ik graag vanuit een Cpp applicatie een java object aanspreken. Na veel resources nageplozen te hebben kwam ik op devworks van IBM een goed artikel tegen...

Deze heb ik gebrobeerd, maar helaas ik kom er niet uit. Compileren gaat prima, echter op het moment dat de linker er aan te pas komt gaat het fout.
Ik krijg deze melding:
code:
1
2
3
4
5
6
7
8
9
10
11
--------------------Configuration: TEST101 - Win32 Debug--------------------
Compiling...
StdAfx.cpp
Compiling...
TEST101.cpp
Linking...
TEST101.obj : error LNK2001: unresolved external symbol __imp__JNI_CreateJavaVM@12
Debug/TEST101.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

TEST101.exe - 2 error(s), 0 warning(s)

Heb dus een externe functie nodig, deze zit in een dll (jvm.dll) hoe gebruik ik deze???

Voor de volledigheid hier de rest van de (cpp) code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include "stdafx.h"
#include <jni.h>
#include <memory.h>

#ifdef _WIN32
#define PATH_SEPARATOR ';'
#else
#define PATH_SEPARATOR ':'
#endif

int main()
{
    JavaVMOption options[1];
    JNIEnv *env;
    JavaVM *jvm;
    JavaVMInitArgs vm_args;
    long status;
    jclass cls;
    jmethodID mid;
    jint square;
    jboolean not;

    options[0].optionString = "-Djava.class.path=.";
    memset(&vm_args, 0, sizeof(vm_args));
    vm_args.version = JNI_VERSION_1_2;
    vm_args.nOptions = 1;
    vm_args.options = options;
    status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

    if (status != JNI_ERR)
    {
        cls = env->FindClass("Sample2");
        if(cls !=0)
        {   mid = env->GetStaticMethodID(cls, "intMethod", "(I)I");
            if(mid !=0)
            {   square = env->CallStaticIntMethod(cls, mid, 5);
                printf("Result of intMethod: %d\n", square);
            }

            mid = env->GetStaticMethodID(cls, "booleanMethod", "(Z)Z");
            if(mid !=0)
            {   not = env->CallStaticBooleanMethod(cls, mid, 1);
                printf("Result of booleanMethod: %d\n", not);
            }
        }

        jvm->DestroyJavaVM();
        return 0;
    }
    else
        return -1;
}

Wat niet kan is nog nooit gebeurd


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Import library, waarschijnlijk jvm.lib. Daar staat in wat de linker moet aanmaken om runtime __imp__JNI_CreateJavaVM@12 te vinden.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

En vervolgens voeg je deze jvm.lib toe in de 'Additional Libraries' in de linker options van de compiler (kan niet distilleren of je VC6 of VC.net gebruikt dus je moet zelf ff zoeken waar ze bij jou zitten.

Een alternatieve optie is de volgende coderegel toe te voegen:
C++:
1
#pragma comment(lib, "jvm.lib")

Deze zorgt er automatisch voor dat ieder project dat deze CPP-file gebruikt deze lib mee zal linken indien nodig.

Professionele website nodig?


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 28-01 13:50
Thx, zal het gelijk gaan proberen.

Wat niet kan is nog nooit gebeurd


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 28-01 13:50
Werkt!
Nog even de dll aan het PATH toegevoegd en het gaat zoals het moet.

Wat niet kan is nog nooit gebeurd