0

我从 C++ 触摸屏程序更改页面,同时需要从 Android 更改图像。但是当它(C++ JNI)调用 java JNI 时,它会在 JNIPage.java 的 setContentView() 上抛出“java.lang.NullPointerException”。这是代码:

C++ JNI:

void ofAppAndroidWindow::page(int wMethod){
JNIEnv *env = ofGetJNIEnv();
    if (!env) {
        ofLog(OF_LOG_ERROR,"Failed to get the environment using GetEnv()");
        return;
    }
jclass localClass = env->FindClass("cc/openframeworks/androidEmptyExample/JNIPage");
javaClass = (jclass) env->NewGlobalRef(localClass);

if(!javaClass){
    ofLog(OF_LOG_ERROR,"Failed to get the java class for JNIPage");
    return;
}

jmethodID javaPageMethod = env->GetMethodID(javaClass,"changePage","(I)V");
if(!javaPageMethod){
    ofLog(OF_LOG_ERROR,"Failed to get the java constructor for JNIPage");
    return;
}

javaJNI = env->NewObject(javaClass,javaPageMethod);
if(!javaJNI){
    ofLog(OF_LOG_ERROR,"Failed to create java JNIPage");
    return;
}

javaJNI = (jobject)env->NewGlobalRef(javaJNI);
env->CallVoidMethod(javaJNI,javaPageMethod,wMethod);

}

Java 代码:

public class OFActivity extends Activity {
.........
}

Java 代码:

public class JNIPage extends Activity {

public static int wPage;
   ImageView imageBatteryEmpty;
   JNIPage(){

    }

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();

}

public void changePage (int a1) {
    wPage = a1;
    if (wPage == 0) {
        setContentView(R.layout.battery);
        imageBatteryEmpty = (ImageView) findViewById(R.id.imageView1);
        imageBatteryEmpty.setImageResource(R.drawable.battery_low_42x);

    }

}

}

电池.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="28dp"
    android:paddingTop="510dp"
    android:src="@drawable/batteryempty2x" />

</LinearLayout>

日志猫

08-19 16:09:12.714: W/dalvikvm(12900): threadid=11: thread exiting with uncaught exception (group=0x40ae1480)
08-19 16:09:12.714: E/EmbeddedLogger(433): App crashed! Process: cc.openframeworks.androidEmptyExample
08-19 16:09:12.714: E/EmbeddedLogger(433): App crashed! Package: cc.openframeworks.androidEmptyExample v1 (1.0)
08-19 16:09:12.714: E/AndroidRuntime(12900): FATAL EXCEPTION: GLThread 1230
08-19 16:09:12.714: E/AndroidRuntime(12900): java.lang.NullPointerException
08-19 16:09:12.714: E/AndroidRuntime(12900):    at android.app.Activity.setContentView(Activity.java:1897)
08-19 16:09:12.714: E/AndroidRuntime(12900):    at cc.openframeworks.androidEmptyExample.JNIPage.changePage(JNIBattery.java:42)
08-19 16:09:12.714: E/AndroidRuntime(12900):    at cc.openframeworks.OFAndroid.render(Native Method)
08-19 16:09:12.714: E/AndroidRuntime(12900):    at cc.openframeworks.OFAndroidWindow.onDrawFrame(OFAndroid.java:841)
08-19 16:09:12.714: E/AndroidRuntime(12900):    at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1470)
08-19 16:09:12.714: E/AndroidRuntime(12900):    at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1224)
08-19 16:09:12.714: W/ActivityManager(433):   Force finishing activity cc.openframeworks.androidEmptyExample/.OFActivity
4

1 回答 1

0

AndroidActivity有相当多的内部管理需要维护。您的 emtpy 构造函数没有初始化这些,导致 NPE。

Activity必须以orstartActivity()开头startActivityForResult()。仅仅像上面的 JNI 代码那样创建一个实例对象是行不通的。

于 2013-08-19T09:43:51.527 回答