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属性与方法签名列表
1997

被折叠的 条评论
为什么被折叠?



