JNI开发

JNI

java native interface

使用环境:

java api 不能满足我们程序的需要的时候。
算法计算,图像渲染 效率要求非常高,
当需要访问一些已有的本地库

NDK
工具的集合。帮助开放者快速开放C/C++ 动态库的工具。

JNI 开发

1.编写native方法

public class JniMain {
	public static native String getStringFromC();
	
	public static void main(String[] args) {
	}
}
2.javah 命令,生成.h文件  java_类的全名_方法名 或者自己手写


3.复制.h头文件到cpp工程


4.复制jin.h和jin_md.h


5.实现.h头文件声明的函数


6.生成一个dll动态库





7.在java种加载动态库

8触发native函数



#include "JniMain.h"
#include <sdkddkver.h>
#include <stdio.h>
#include <tchar.h>
#include <string.h>

//静态方法
JNIEXPORT jstring JNICALL Java_JniMain_getStringFromC
(JNIEnv * env, jclass jclaz) {
	return (*env)->NewStringUTF(env, "C String");
}

//非静态方法 jobject
JNIEXPORT jstring JNICALL Java_JniMain_getStringFromC2
(JNIEnv * env, jobject jobj) {
	return (*env)->NewStringUTF(env, "C2 String");
}

//访问非静态域
JNIEXPORT void JNICALL Java_JniMain_accessField
(JNIEnv * env, jobject jobj) {
	//jclass
	jclass jclz = (*env)->GetObjectClass(env, jobj);
	//filedid  属性名称 属性签名
	jfieldID fid = (*env)->GetFieldID(env, jclz, "mFild", "Ljava/lang/String;");
	//得到mFild对应的值
	jstring jstr = (*env)->GetObjectField(env, jobj, fid);
	//jni -> c
	char * cstr = (*env)->GetStringUTFChars(env, jstr, NULL);
	char text[30] = "aaaa";
	//生成新的字符串 aaaa key
	strcat(text, cstr);
	//c->jni
	jstring new_str = (*env)->NewStringUTF(env, text);
	(*env)->SetObjectField(env, jobj, fid, new_str);

	(*env)->ReleaseStringUTFChars(env, new_str, cstr);
}

JNIEXPORT void JNICALL Java_JniMain_accessStaticField
(JNIEnv * env, jobject jobj) {
	//jclass
	jclass jclz = (*env)->GetObjectClass(env, jobj);
	//filedid  属性名称 属性签名
	jfieldID fid = (*env)->GetStaticFieldID(env, jclz, "count", "I");
	jint count = (*env)->GetStaticIntField(env, jobj, fid);
	count++;
	(*env)->SetStaticIntField(env,jclz,fid,count);
}


重新生成即可



Java属性与方法签名列表



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值