[英]Get Java object using C++ to call the Java method
我正在为Android开发本机代码和Java代码。
我计划基于C / C ++代码调用Java侦听器。 这个想法是C / C ++代码调用实际上调用Java侦听器的方法。
C / C ++代码如下。 我可以使用以下代码调用Java方法:第一个代码块是在JNI_OnLoad中初始化methodid和class
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
return -1;
}
jclass dataClass = env->FindClass("com/example/crowdlogic/NativeManager");
dataClassHandle = (jclass)env->NewGlobalRef(dataClass);
if (dataClassHandle == NULL) LOGI("dataClassHandle null");
LOGI("init dataUpdateHandle");
dataUpdateHandle = env->GetMethodID(dataClassHandle, "dataUpdate", "(I)V");
if (dataUpdateHandle == NULL) LOGI("dataUpdateHandle null");
return JNI_VERSION_1_6;
}
下一个代码块实际上正在调用它:
void sendCount(int totalCount) {
jint jtotalCount = totalCount;
jobject dataObjectHandle = env->NewObject(dataClassHandle, dataUpdateHandle);
if (dataObjectHandle == NULL) LOGI("dataObjectHandle null");
env->CallVoidMethod(dataObjectHandle, dataUpdateHandle, jtotalCount);
}
在Java部分中,dataUpdate方法实际上是被调用的,但是从不调用侦听器。 侦听器为null。 这是Java侦听器类
public class NativeManager {
private static final String TAG = "crowdlogic:native_manager";
// all the listener stuff below
public interface Listener {
public void onDataUpdated(int totalCount);
}
private Listener mListener = null;
public void registerListener (Listener listener) {
mListener = listener;
}
public void dataUpdate(int totalCount) { // call this from JNI in C++ class
// now notify if someone is interested.
Log.i(TAG, "Data update in Java called");
if (mListener != null) {
Log.i(TAG, "mListener not null");
mListener.onDataUpdated(totalCount);
}
else
Log.i(TAG, "mListener null"); // always come to this; the listener is null
}
}
在我的主要活动中,我实例化了侦听器(在onCreate内部):
@Override
protected void onCreate(Bundle savedInstanceState) {
...
// start listener for data update
mNativeMgr = new NativeManager();
mNativeMgr.registerListener(this);
mNativeMgr.dataUpdate(0);
...
}
我认为这是因为在本机部分中,我没有使用实例化的Java侦听器对象,而是实际上使用
jobject dataObjectHandle = env->NewObject(dataClassHandle, dataUpdateHandle);
内部void sendCount(int totalCount)。
我的问题是,如何在C / C ++代码中获取实例化的Java对象而不是创建一个新的Java对象? 谢谢大家,已经花了最后两天了...
我找到了解决方案。 我将Java方法设置为静态方法,而不是调用动态方法,而是使用CallStaticVoidMethod从C ++调用它。 代码示例:
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
return -1;
}
jclass dataClass = env->FindClass("com/example/crowdlogic/NativeManager");
dataClassHandle = (jclass)env->NewGlobalRef(dataClass);
dataUpdateHandle = env->GetStaticMethodID(dataClassHandle, "dataUpdate", "(I)V");
return JNI_VERSION_1_6;
}
调用Java方法的本机函数:
void sendCount(int totalCount) {
jint jtotalCount = totalCount;
jobject dataObjectHandle = env->NewObject(dataClassHandle, dataUpdateHandle);
if (dataObjectHandle == NULL) LOGI("dataObjectHandle null");
LOGI("init CallVoidMethod");
env->CallStaticVoidMethod(dataClassHandle, dataUpdateHandle, jtotalCount);
}
在Java中,我将该方法声明为静态方法
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.