반응형
Android의 C ++에서 Java 메서드 호출
Java가 네이티브 메서드를 호출하는 동안 C ++에서 간단한 Java 메서드 호출을 얻으려고합니다. 다음은 Java 코드입니다.
public class MainActivity extends Activity {
private static String LIB_NAME = "name";
static {
System.loadLibrary(LIB_NAME);
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = (TextView) findViewById(R.id.textview);
tv.setText(this.getJniString());
}
public void messageMe(String text) {
System.out.println(text);
}
public native String getJniString();
}
Java에서 네이티브 messageMe
로 getJniString*
메서드를 호출 하는 과정에서 네이티브 코드에서 메서드 를 호출하려고합니다 .
native.cpp :
#include <string.h>
#include <stdio.h>
#include <jni.h>
jstring Java_the_package_MainActivity_getJniString( JNIEnv* env, jobject obj, jint depth ){
// JavaVM *vm;
// JNIEnv *env;
// JavaVMInitArgs vm_args;
// vm_args.version = JNI_VERSION_1_2;
// vm_args.nOptions = 0;
// vm_args.ignoreUnrecognized = 1;
//
// // Construct a VM
// jint res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args);
// Construct a String
jstring jstr = env->NewStringUTF("This string comes from JNI");
// First get the class that contains the method you need to call
jclass clazz = env->FindClass("the/package/MainActivity");
// Get the method that you want to call
jmethodID messageMe = env->GetMethodID(clazz, "messageMe", "(Ljava/lang/String;)V");
// Call the method on the object
jobject result = env->CallObjectMethod(jstr, messageMe);
// Get a C-style string
const char* str = env->GetStringUTFChars((jstring) result, NULL);
printf("%s\n", str);
// Clean up
env->ReleaseStringUTFChars(jstr, str);
// // Shutdown the VM.
// vm->DestroyJavaVM();
return env->NewStringUTF("Hello from JNI!");
}
클린 컴파일 후 앱이 다음 메시지와 함께 중지됩니다.
ERROR/AndroidRuntime(742): FATAL EXCEPTION: main
java.lang.NoSuchMethodError: messageMe
at *.android.t3d.MainActivity.getJniString(Native Method)
at *.android.t3d.MainActivity.onCreate(MainActivity.java:22)
분명히 메서드 이름이 잘못되었음을 의미하지만 나에게는 괜찮아 보입니다.
객체 메서드 인 경우 객체를에 전달해야합니다 CallObjectMethod
.
jobject result = env->CallObjectMethod(obj, messageMe, jstr);
당신이했던 일은 jstr.messageMe()
.
귀하는 void 메서드이므로 다음을 호출해야합니다.
env->CallVoidMethod(obj, messageMe, jstr);
결과를 반환하려면 JNI 서명 ( 반환 유형 ()V
의 메서드를 의미 함 void
)과 Java 코드의 반환 유형을 변경해야합니다.
Solution posted by Denys S. in the question post:
I quite messed it up with c to c++ conversion (basically env
variable stuff), but I got it working with the following code for C++:
#include <string.h>
#include <stdio.h>
#include <jni.h>
jstring Java_the_package_MainActivity_getJniString( JNIEnv* env, jobject obj){
jstring jstr = (*env)->NewStringUTF(env, "This comes from jni.");
jclass clazz = (*env)->FindClass(env, "com/inceptix/android/t3d/MainActivity");
jmethodID messageMe = (*env)->GetMethodID(env, clazz, "messageMe", "(Ljava/lang/String;)Ljava/lang/String;");
jobject result = (*env)->CallObjectMethod(env, obj, messageMe, jstr);
const char* str = (*env)->GetStringUTFChars(env,(jstring) result, NULL); // should be released but what a heck, it's a tutorial :)
printf("%s\n", str);
return (*env)->NewStringUTF(env, str);
}
And next code for java methods:
public class MainActivity extends Activity {
private static String LIB_NAME = "thelib";
static {
System.loadLibrary(LIB_NAME);
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = (TextView) findViewById(R.id.textview);
tv.setText(this.getJniString());
}
// please, let me live even though I used this dark programming technique
public String messageMe(String text) {
System.out.println(text);
return text;
}
public native String getJniString();
}
참고URL : https://stackoverflow.com/questions/5198105/calling-a-java-method-from-c-in-android
반응형
'developer tip' 카테고리의 다른 글
Xcode 8 프로비저닝 프로파일이 다운로드되지 않음 (0) | 2020.09.10 |
---|---|
std :: stou가없는 이유는 무엇입니까? (0) | 2020.09.10 |
버전이 지정된 API의 기본 코드베이스를 어떻게 관리합니까? (0) | 2020.09.10 |
Google Colaboratory : GPU에 대한 잘못된 정보 (일부 사용자는 5 % RAM 만 사용 가능) (0) | 2020.09.10 |
전송 인코딩 : gzip 대 콘텐츠 인코딩 : gzip (0) | 2020.09.10 |