求助Android Studio下JNI回调问题?CPP调用java函数,运行到CallVoidMethod就崩溃

yeah2000 2017-12-02 03:14:56



文件名 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()
{
}
}



一个多星期了,还没找到原因,一运行点击按钮就崩溃
...全文
759 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yeah2000 2017-12-07
  • 打赏
  • 举报
回复


PC软件用VC++,vlc
安卓在jni中实现udp广播,回调java类,通过回调类信息获知成功失败以及ip地址信息,再通过tcpclient连接pc端软件,进行操作。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我是安卓小白,这是我的第二个安卓小程序

yeah2000 2017-12-07
  • 打赏
  • 举报
回复
引用 7 楼 jklwan 的回复:
[quote=引用 4 楼 yeah2000 的回复:] 我只是想回调一个类的函数,没想new它,这是没办法到处找实验方法

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类) 有些是可以全局使用,有些不可以全局使用,这导致的崩溃问题
jklwan 2017-12-06
  • 打赏
  • 举报
回复
引用 4 楼 yeah2000 的回复:
我只是想回调一个类的函数,没想new它,这是没办法到处找实验方法

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就报错了。
yeah2000 2017-12-05
  • 打赏
  • 举报
回复


再来一个奇怪的问题
TestJavaC 和TestJavaCC在java中定义是一样的,在同一个主类中。但是TestJavaC能正常,TestJavaCC怎么都不正常。
就是只留下TestJavaCC也不行。

真是奇怪,求大神给看看


yeah2000 2017-12-05
  • 打赏
  • 举报
回复
已经搞定~~~~~~~~~
jklwan 2017-12-04
  • 打赏
  • 举报
回复
Activity不同于普通的类,并不能new一个。所以你调用在jni中调用init(也就是构造方法)是不行的。单独写个类来测试就行了。
yeah2000 2017-12-04
  • 打赏
  • 举报
回复
引用 3 楼 jklwan的回复:
Activity不同于普通的类,并不能new一个。所以你调用在jni中调用init(也就是构造方法)是不行的。单独写个类来测试就行了。
我只是想回调一个类的函数,没想new它,这是没办法到处找实验方法
yeah2000 2017-12-03
  • 打赏
  • 举报
回复
顶帖求助~~~~~~~~~
yeah2000 2017-12-02
  • 打赏
  • 举报
回复
工程文件放在了百度盘上了,求助给看看 https://pan.baidu.com/s/1miGH3Gc

80,359

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧