java jni调用两种方法之动态方式

JniDynamic.java

public class JniDynamic {

  public JniDynamic() {
    System.load("/home/yym/jniDynamic/libjniDynamic.so");
  }

  public static void main(String[] args) {
    JniDynamic jni = new JniDynamic();
    System.out.println(""+jni.test1());
    jni.test2();
  }

  public native String test1();
  public native void test2();

}

JniDynamic.cpp

#include "jni.h"
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
#define ARRAY_LENGTH(a) (sizeof(a)/sizeof(a[0]))
jstring ctest1(JNIEnv *jniEnv, jobject jobject1) {
  return jniEnv->NewStringUTF("yym-ctest1");
}
void ctest2(JNIEnv *jniEnv, jobject jobject1) {
  string str = "yym-ctest2";
  printf("%s\n", str.c_str());
  cout<<"yym:"<<str<<endl;
}
//static const char *className = "JniDynamic";
static const JNINativeMethod mMethods[] = {
        {"test2", "()V", (void *) ctest2},
        {"test1", "()Ljava/lang/String;", (void *) ctest1}
};
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *vm, void *reserved) {
    JNIEnv *env = NULL;
    //获得JNIEvn
    int r = vm->GetEnv((void **) &env, JNI_VERSION_1_4);
    if (r != JNI_OK) {
        return -1;
    }
    char chars[] = "JniDynamic";
    char *className = chars;
    //获取对应Java类的class
    jclass jniClass = env->FindClass(className);
    //注册,最后一个参数为注册的方法数,需要动态修改
    r = env->RegisterNatives(jniClass, mMethods, ARRAY_LENGTH(mMethods));
    //如果小于0 则注册失败
    if (r != JNI_OK) {
        return -1;
    }
    return JNI_VERSION_1_4;
}

##编译动态库

g++ -fPIC -I /home/yym/code/jdk1.8.0_361/include -I /home/yym/code/jdk1.8.0_361/include/linux -shared -o libjniDynamic.so JniDynamic.cpp

##编译java类

javac JniDynamic.java
##执行java

java JniDynamic

##执行结果

yym@ubuntu16:~/jniDynamic$ java JniDynamic
yym-ctest1
yym-ctest2
yym:yym-ctest2

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值