Android-NDK 开发之第四个例子--用C/C++调用Java

用C/C++调用Java的方法我没有去研究,也不知道从哪里开始研究,对Linux我了解到很少,希望有朋友可以给些资料,我的水平很差,望大家多多包涵。

这个例子是别人的代码,我忘记从来里弄来的了,先对原作者表示抱歉。同时代码也被我修改过,再次道歉。

而此文和别的文章一样,只是作为我平时学习积累的验证。

1. Android.mk文件:

LOCAL_SRC_FILES参数用空格隔开

?
1
2
3
4
5
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类的函数。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#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
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* 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
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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
?
1
2
3
4
5
6
7
8
9
10
11
package com.easepal.geolo;
 
public class CForCall{
    public CForCall(){};
    //public ~CForCall(){};
    public String GetJavaString(){
        String str;
        str = "123456" ;
        return str;
    }
}

文字出处:  http://blog.csdn.net/geolo/article/details/6167542
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值