JNI C++调用Java、JAVA调用C++代码说明

C++代码:

#include "video1_TestNative.h"  
#include <iostream>  
using namespace std;  
JNIEXPORT void JNICALL Java_video1_TestNative_sayHello(JNIEnv * env, jobject obj){  
    cout<<"Hello Native Test !"<<endl;  
    //因为test不是静态函数,所以传进来的就是调用这个函数的对象  
    //否则就传入一个jclass对象表示native()方法所在的类  
    jclass native_clazz = env->GetObjectClass(obj);  
  
    //得到jfieldID  
    jfieldID fieldID_prop = env->GetFieldID(native_clazz,"name","Ljava/lang/String;");  
    jfieldID fieldID_num = env->GetFieldID(native_clazz,"number","I");  
  
    //得到jmethodID  
    jmethodID methodID_func=env->GetMethodID(native_clazz,"signTest","(ILjava/util/Date;[I)I");  
    //调用signTest方法  
    env->CallIntMethod(obj,methodID_func,1L,NULL,NULL);  
  
    //得到name属性  
    jobject name = env->GetObjectField(obj,fieldID_name);  
    //得到number属性  
    jint number= env->GetIntField(obj,fieldID_num);   
  
    cout<<number<<endl;//100  
    //修改number属性的值  
    env->SetIntField(obj,fieldID_num,18880L);    
    number= env->GetIntField(obj,fieldID_num);    
    cout<<number<<endl;//18880  
 }  

Java代码:

package video1;  
  
import java.util.Date;  
  
public class TestNative {  
    public String name="Test";  
    public int number =100;  
    public int signTest(int i,Date date,int[] arr){  
        System.out.println("Sign Test");  
        return 0;  
    }  
    //native关键字修饰的方法,其内容是C/C++编写的,java中不必为它编写具体的实现  
    public native void sayHello();  
    public static void main(String[] args) {  
        System.loadLibrary("NativeCode");  
        TestNative tn = new TestNative();  
        tn.sayHello();  
    }  
}  

基本类型对应关系

标识串Jni 类型C 类型
voidvoid
Zjbooleanboolean
 Ijintint
Jjlonglong
Djdoubledouble
Fjfloatfloat
Bjbytebyte
Cjcharchar
Sjshortshort

基本类型数组  (以 [ 开始,用两个字符表示)

标识串 Jni 类型C 类型
[ZjbooleanArraybool []
[IjintArrayint[]
[JjlongArraylong[]
[DjdoubleArraydouble[]
[FjfloatArrayfloat[]
[BjbyteArraybyte[]
[CjcharArraychar[]
[SjshortArrayshort[]

类(class)(以 L 开头,以 ; 结尾,中间是用 / 隔开的 包 及 类名)

标识串Java 类型Jni 类型
L包1/包n/类名; 类名jobject
Ljava/net/Socket;Socketjobject

String类

标识串Java 类型Jni 类型
L包1/包n/类名; 类名jobject
Ljava/lang/String; Stringjstring

嵌套类 (类位于另一个类之中,则用$作为类名间的分隔符)

标识串Java 类型Jni 类型
L包1/包n/类名$嵌套类名;类名jobject
Landroid/os/FileUtils$FileStatus;FileStatusjobject
需注意:
在env->FindClass(xxx);时不写Ljava/lang/String; 而是java/lang/String
jclass clz = env->FindClass("java/lang/String");

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值