android ndk 开发,C++ 调用Java的方法

C++调Jjava的方法,非静态的方法一调就卡死,静态方法可以正常调用,请问这是怎么回事?... C++ 调Jjava的方法,非静态的方法一调就卡死,静态方法可以正常调用,请问这是怎么回事? 展开
 我来答
妮浅笑99
推荐于2016-03-28 · 还没有任何签名哦
妮浅笑99
采纳数:126 获赞数:1392

向TA提问 私信TA
展开全部
  1. Android.mk文件:



LOCAL_SRC_FILES参数用空格隔开

[c-sharp] view plaincopyprint?

LOCAL_PATH:=$(call my-dir)  

include $(CLEAR_VARS)  

LOCAL_MODULE:=native   

LOCAL_SRC_FILES:=geolo.cpp my_jni.h   

include $(BUILD_SHARED_LIBRARY)  

 


 

2. geolo.cpp

先用FindClass方法找到java类,有点类似java的反射用LoadClass

再用CallObjectMethod方法调用Java类的函数。


[c-sharp] view plaincopyprint?

#include "my_jni.h"  

jobject getInstance(JNIEnv* env, jclass obj_class){  

    jmethodID construction_id = env->GetMethodID(obj_class, "<init>", "()V");  

    jobject obj = env->NewObject(obj_class, construction_id);  

    return obj;  

}  

JNIEXPORT jstring JNICALL Java_com_easepal_geolo_CActivityMain_stringFromJNI(JNIEnv* env, jobject thiz){  

   jstring str;  

   jclass java_class = env->FindClass("com/easepal/geolo/CForCall");  

    if (java_class == 0){  

       return env->NewStringUTF("not find class!");  

    }  

   jobject java_obj = getInstance(env, java_class);  

   if (java_obj == 0){  

       return env->NewStringUTF("not find java OBJ!");  

   }  

   jmethodID java_method = env->GetMethodID(java_class, "GetJavaString", "()Ljava/lang/String;");  

   if(java_method == 0){  

       return env->NewStringUTF("not find java method!");  

   }  

   str = (jstring)env->CallObjectMethod(java_obj, java_method);  

   return str;  

}  

3. my_jni.h

 


[c-sharp] view plaincopyprint?

/* DO NOT EDIT THIS FILE - it is machine generated */  

#include <jni.h>  

/* Header for class com_easepal_geolo_CActivityMain */  

#ifndef _Included_com_easepal_geolo_CActivityMain  

#define _Included_com_easepal_geolo_CActivityMain  

#ifdef __cplusplus  

extern "C" {  

#endif  

/* 

* Class:     com_easepal_geolo_CActivityMain 

* Method:    stringFromJNI 

* Signature: ()Ljava/lang/String; 

*/  

JNIEXPORT jstring JNICALL Java_com_easepal_geolo_CActivityMain_stringFromJNI(JNIEnv *, jobject);  

#ifdef __cplusplus  

}  

#endif  

#endif  

 


 

4. CActivityMain.java


[c-sharp] view plaincopyprint?

package com.easepal.geolo;  

import android.app.Activity;  

import android.os.Bundle;  

import android.widget.TextView;  

public class CActivityMain extends Activity {  

    /** Called when the activity is first created. */  

    @Override  

    public void onCreate(Bundle savedInstanceState){  

        super.onCreate(savedInstanceState);  

        TextView tv = new TextView(this);  

        tv.setText( stringFromJNI("hello") );  

        setContentView(tv);  

    }  

      

      

    static {  

        System.loadLibrary("native");  

    }  

    public native String stringFromJNI(String str);  

}  

 


 

5. CForCall.java


[c-sharp] view plaincopyprint?

package com.easepal.geolo;  

public class CForCall{  

   public CForCall(){};  

   //public ~CForCall(){};  

   public String GetJavaString(){  

       String str;  

       str = "123456";  

       return str;  

   }  

}  

fukeainideren
2014-10-27 · TA获得超过1934个赞
知道小有建树答主
回答量:461
采纳率:100%
帮助的人:168万
展开全部
这个问题可以看我的帖子“ndk java 和 c 互掉”:
http://jingyan.baidu.com/article/f54ae2fcde72be1e92b84916.html
帖子集文档,截图,视频于一体,同时包括,java调用c,c调用java,javap,javah的使用等,
希望对你有用,我是ndk吧吧主,有问题可以ndk吧留言,谢谢!
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式