JAVA学习(12) JAVA调用C++

package com.ui.test; 

public class test { 
    public test() {


    }
      static {
            System.loadLibrary("jnitest");
        }

        public native void testfuc(String instring);

    public static void main(String[] srgs)
    {
        test testx = new test();
        testx.testfuc("hello");
    }

}

#include "stdafx.h"
#include <jni.h>



static void JNICALL Test(JNIEnv *env, jobject arg, jstring instring)
{
    const char *str = (const char *)env->GetStringUTFChars(instring, JNI_FALSE);

    ::MessageBoxA(0, str, "str", 0);

    env->ReleaseStringUTFChars(instring, str);
}
static const JNINativeMethod gMethods[] = { //定义批量注册的数组,是注册的关键部分
    { "testfuc", "(Ljava/lang/String;)V", (void*)Test } // func2是在java中声明的native函数名,"()V"是函数的签名,可以通过javah获取。
};
JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void *reserved) //这是JNI_OnLoad的声明,必须按照这样的方式声明
{
    ::MessageBoxA(0, "JNI_OnLoad", "str", 0);
    JNIEnv* env = NULL; //注册时在JNIEnv中实现的,所以必须首先获取它
    jint result = -1;

    if (vm->GetEnv(  (void**)&env, JNI_VERSION_1_4) != JNI_OK) //从JavaVM获取JNIEnv,一般使用1.4的版本
        return -1;


    jclass clazz;
    static const char* const kClassName = "com/ui/test/test";

    clazz =env->FindClass(kClassName); //这里可以找到要注册的类,前提是这个类已经加载到java虚拟机中。 这里说明,动态库和有native方法的类之间,没有任何对应关系。

    if (clazz == NULL)
    {
        ::MessageBoxA(0, "JNI_OnLoad", kClassName, 0);
        return -1;
    }


    if (env->RegisterNatives(clazz, gMethods, sizeof(gMethods) / sizeof(gMethods[0])) != JNI_OK) //这里就是关键了,把本地函数和一个java类方法关联起来。不管之前是否关联过,一律把之前的替换掉!
    {
        printf("register native method failed!\n");
        return -1;
    }

    return JNI_VERSION_1_4; //这里很重要,必须返回版本,否则加载会失败。
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值