当前位置: 代码迷 >> Android >> 如何在可执行文件里使用jni,让c回调到java
  详细解决方案

如何在可执行文件里使用jni,让c回调到java

热度:99   发布时间:2016-04-28 03:39:42.0
怎么在可执行文件里使用jni,让c回调到java.
本帖最后由 szuzsq 于 2014-11-13 10:39:52 编辑
是可执行文件,即main函数,不是*.so库函数.
注,库函数里我已经可以调用java了..


jint Java_com_example_jni_NativeJniAdder_inc(JNIEnv* env, jobject obj, jint a, jint b) {
//C中映射类
jclass cls = (*env)->FindClass(env, "com/example/jni/TestProvider");

//C中新建对象
jmethodID method = (*env)->GetMethodID(env, cls, "<init>", "()V");
jobject object = (*env)->NewObject(env, cls, method);

//C中映射方法
//静态
jmethodID getTime = (*env)->GetStaticMethodID(env, cls, "getTime", "()Ljava/lang/String;");
//非静态
jmethodID sayHello = (*env)->GetMethodID(env, cls, "sayHello", "(Ljava/lang/String;)V");

//C中调用Java的方法
//静态
jstring jstr = (*env)->CallStaticObjectMethod(env, cls, getTime);
char* cstr = (char*)(*env)->GetStringUTFChars(env, jstr, 0);
__android_log_print(ANDROID_LOG_INFO, "NativeJniAdder.c_inc", "Get Time from Java:%s", cstr);
(*env)->ReleaseStringUTFChars(env, jstr, cstr);
(*env)->DeleteLocalRef(env, jstr);

//非静态
jstring jstrMSG = (*env)->NewStringUTF(env, "Hi,I'm From C");
(*env)->CallVoidMethod(env, object, sayHello, jstrMSG);
(*env)->DeleteLocalRef(env, jstrMSG);

return a + b;
}

-----------------------------------------
上面这个是在库函数里的,JNIEnv* env, jobject obj这2个做为参数传入..
问题是main函数里怎么得到它们呢?

int main(int argc, char** argv) {
}

------解决思路----------------------
http://xjchilli.blog.163.com/blog/static/45347739201161593859504/
上面链接里有具体操作。
供参考。
  相关解决方案