80,359
社区成员
发帖
与我相关
我的任务
分享
文件名 TestJni.cpp
#include <jni.h>
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jboolean JNICALL Java_com_yoours_berryz2007_liapp_TestJni_SearchServer(JNIEnv *env, jclass obj)
{
jclass dpclazz = env->FindClass("com/yoours/berryz2007/liapp/MainActivity");
jmethodID construction_id = env->GetMethodID(dpclazz, "<init>", "()V");
jobject obj123 = env->NewObject(dpclazz, construction_id);
jmethodID method33 = env->GetMethodID(dpclazz,"TestJavaC","()V");
env->CallVoidMethod(obj, method33);
return JNI_TRUE;
}
#ifdef __cplusplus
}
#endif
文件名TestJni.java
package com.yoours.berryz2007.liapp;
public class TestJni {
public TestJni() {
super();
}
// load so library
static {
System.loadLibrary("TestJni");
}
// Search Server
public static native boolean SearchServer();
}
package com.yoours.berryz2007.liapp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.*;
import android.view.View;
public class MainActivity extends AppCompatActivity {
Button btnSearch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnSearch = (Button) findViewById(R.id.button);
btnSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TestJni.SearchServer();
}
});
}
public void TestJavaC()
{
}
}
jclass dpclazz = env->FindClass("com/yoours/berryz2007/liapp/MainActivity");
jmethodID construction_id = env->GetMethodID(dpclazz, "<init>", "()V");
jobject obj123 = env->NewObject(dpclazz, construction_id);
这三句代码就等同于java的MainActivity activity = new MainActivity();<init>就表示构造方法。你调用一个类中的方法,当然得新建一个对象才能调用。因为Activity不能new就报错了。[/quote]
你提到的问题是问题。但最初调试的时候没有new主类,反复测试不成功才乱找方法,new了一次。
主要问题有两个:
1. 真机调试时如果失败了,最好在下次调试之前先卸载掉调试安装的app。
因为我调试发现,以前正常的也不正常了。后来试着删除安装的app,就没问题了。
2. jni局部和多线程全局引用class,jmethodID,jobject,jfieldID的使用,他们之间的使用方法(尤其该使用哪个参数)不一样导致的调用崩溃。
主要有C结构体转为java回调参数(Java类)
有些是可以全局使用,有些不可以全局使用,这导致的崩溃问题
jclass dpclazz = env->FindClass("com/yoours/berryz2007/liapp/MainActivity");
jmethodID construction_id = env->GetMethodID(dpclazz, "<init>", "()V");
jobject obj123 = env->NewObject(dpclazz, construction_id);
这三句代码就等同于java的MainActivity activity = new MainActivity();<init>就表示构造方法。你调用一个类中的方法,当然得新建一个对象才能调用。因为Activity不能new就报错了。