public class JniTest{
public static void main(String[] args){
System.out.print("Hello World " + args[0]);
}
}
// 빌드는 아래와 같이 하면 JniTest.class 파일이 생성된다.
>javac JniTest.java
// JniCall.c
#include
#define PATH_SEPARATOR ';'
#define USER_CLASSPATH "."
void main(){
JNIEnv *env;
JavaVM *jvm;
jint res;
jclass cls;
jmethodID mid;
jstring jstr;
jclass stringClass;
jobjectArray args;
JavaVMInitArgs vm_args;
JavaVMOption options[1];
options[0].optionString = "-Djava.class.path=" USER_CLASSPATH;
vm_args.version = 0x00010002; // 버전정보를 입력한다.
vm_args.options = options; // 옵션할당
vm_args.nOptions = 1; // 옵션의 아규먼트 갯수를 지정한다. 하나이므로 1
vm_args.ignoreUnrecognized = JNI_TRUE; // 자바가상머신이 옵션값이 잘못되어도 무시하고 진행.. 반대는 JNI_FALSE
/* Create the Java VM */
// 자바 가상머신 생성.. env주소를 넘기는건 여기 담아주셔요~~라고하는 것
// env에는 JNI 인터페이스 포인터 주소가 저장된다.
res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if (res < 0) {
fprintf(stderr, "Can't create Java VM\n");
exit(1);
}
// JniTest 클래스를 로드한다.
cls= (*env)->FindClass(env, "JniTest"); // 빌드된 JniTest.class가 있어야 겠죠.
if (cls == 0) {
fprintf(stderr, "Can't find JniTest class\n");
exit(1);
}
// 자바 소스에서 main함수 ID를 가져온다.
mid = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V");
// String jstr = "from C!"; 이녀석이랑 똑같음.
jstr = (*env)->NewStringUTF(env, "from C!");
// String 클래스를 가져온다.
stringClass = (*env)->FindClass(env, "java/lang/String");
// 자바 메인함수가 main(String[] args) 이렇게 구성되어있으니..
// 똑같이 배열로 오브젝트를 구성한다.
args = (*env)->NewObjectArray(env, 1, stringClass, jstr);
// main함수를 호출합니다!
(*env)->CallStaticVoidMethod(env, cls, mid, args);
// 예외처리
if((*env)->ExceptionOccurred(env)){
(*env)->ExceptionDescribe(env);
}
(*jvm)->DestroyJavaVM(jvm);
}
// 빌드는 반드시 Visual Studio Command Prompt를 실행하여 아래 명령어를 실행한다.
cl -I"D:\MyDevelopment\Android\Java\jdk1.7.0\include" -I"D:\MyDevelopment\Android\Java\jdk1.7.0\include\win32" invocationApi.c -link "D:\MyDevelopment\Android\Java\jdk1.7.0\lib\jvm.lib"
// invocationApi.exe 파일이 생성된다.
// 빌드가 완료되었으니 실행해보자!
>invocationApi.exe
Hello World from C!
// 위와 같이 출력되면 OK!
댓글 없음:
댓글 쓰기