package helloJNI;
public class helloJni {
public native void helloJNI(String name);//java jvm 看到native声明时说明该函数来自其他语言
public static void main(String[] args) {
System.loadLibrary("helloJni");// VS生成的 动态库文件 helloJni.DLL
helloJni ldJni = new helloJni();
ldJni.helloJNI("test Java JNI");
}
}
set JAVA_HOME="D:\Java\jdk1.8.0_111"
set path=%JAVA_HOME%\bin;%path%
set classpath=.;%classpath%;%JAVA_HOME%\lib
javah helloJNI.helloTestJni //(javah 包名.文件名)
D:\Java\jdk1.8.0_111\include
D:\Java\jdk1.8.0_111\include\win32
在.cpp文件中实现函数主体
System.loadLibrary("helloJni"); //helloJni.DLL
定义带有接口参数与返回值的本地方法
public native String echo(String content, boolean flag);
public native int calculateSqr(int x, int y);
public native float calculate(float a, float b);
public native double calculate(double a, double b);
通过javah编译生成头文件
JNIEXPORT jstring JNICALL Java_com_gloomyfish_jni_echo_EchoJNIDemo_echo
(JNIEnv * env, jobject obj, jstring param1, jboolean param2){ //读取参数
const char* content = env->GetStringUTFChars(param1, 0);//
Jsize size = env->GetStringUTFLength(param1);
printf("size of %s: %d\n", content, size);
env->ReleaseStringUTFChars(param1, content);
//创建新字符串并返回
const char* result = "this is call from JNI C++ side";
jstring param3 = env->NewStringUTF(result);
return param3;
}
JNIEXPORT jint JNICALL Java_com_gloomyfish_jni_echo_EchoJNIDemo_calculateSqr
(JNIEnv * env, jobject obj, jint a, jint b){
int x = a;
int y = b;
printf("x = %d y = %d \n", x, y);
int sum = sqrt(x*x + y*y);
return sum;
}
JNIEXPORT jfloat JNICALL Java_com_gloomyfish_jni_echo_EchoJNIDemo_calculate__FF
(JNIEnv *, jobject, jfloat, jfloat);
JNIEXPORT jdouble JNICALL Java_com_gloomyfish_jni_echo_EchoJNIDemo_calculate__DD
(JNIEnv *, jobject, jdouble, jdouble);
public native byte[] process(byte[] data, int width, int height);
public native int[] process(int[] pixels, int width, int height);
JNIEXPORT jbyteArray JNICALL Java_com_gloomyfish_jin_arraydemo_ArrayJNIDemo_process___3BII
(JNIEnv * env, jobject obj, jbyteArray pixels, jint w, jint h){
int width = w;
int height = h;
printf("w = %d h = %d\n", width, height);
jbyte* input = env->GetByteArrayElements()
int index = 0;
for(int row = 0; row < height; row++)
for(int col = 0; col < width; col++){
int value = (int)(input[index]&0xff);
jbyte v = (jbyte)(255 - value);
env->SetByteArrayRegion(pixels, index, 1, &v);
index++;
}
return pixels;
}
JNIEXPORT jintArray JNICALL Java_com_gloomyfish_jin_arraydemo_ArrayJNIDemo_process___3III
(JNIEnv *, jobject, jintArray, jint, jint){
}
public class TestAccessInstanceVarDemo {
private int number = 9;
private String content = "i'm from Java";
public native void changeVars();
//.......
}
//----javah生成 函数
JNIEXPORT void JNICALL Java_com_gloomyfish_jni_classvardemo_TestAccessInstanceVarDemo_changeVars
(JNIEnv * env, jobject obj){
jclass clazz = env->GetObjectClass(obj);//获取类
jfieldID fieldID = env->GetFieldID(clazz, "number", "I");//获取字段 上面 private int number = 9; "I"代表字节码中字段类型
jint number = env->GetIntField(obj, fieldID);//通过 obj对象 和 fieldID 真正获取对象字段值
printf("number : %d", num);
number = (int)pow(number, 2);
env->SetIntField(obj, fieldID, number);//设置number值 回 java中
//获取private String content 字段
jfieldID sfID = env->GetFieldID(clazz, "content", "Ljava/lang/String:");
jstring content = (jstring)env->GetObjectField(obj, sfID);
const char* cc = env->GetStringUTFChars(content, 0);//转换
printf("content: %s\n", cc);
env->ReleaseStringUTFChars(content);//释放
}
public class AccessMethodJNIDemo {
public void callback() {
System.out.println("i'm callback() method");
}
public void callback(String param) {
System.out.println(param);
}
public double sum(double a, double b) {
System.out.println("a = " + a + " b = " + b);
double s = a+b;
return s;
}
public native void showCallback();
//......
}
//----javah生成 函数
JNIEXPORT void JNICALL Java_com_gloomyfish_jni_methoddemo_AccessMethodJNIDemo_showCallback
(JNIEnv *env, jobject obj){
jclass clazz = env->GetObjectClass(obj);
//获取java类中函数字段ID
jmethodID callbackID = env->GetMethodID(clazz, "callback", "()V");//clazz 为类, "callback"为函数名, "()V"为函数类型
env->CallVoidMenthod(obj, callbackID);//调用 obj对象中 callbackID字段iD的函数 实现在C++中调用java类成员函数
//callback with parameter
jmethodID callback2ID = env->GetMethodID(clazz, "callback", "(Ljava/lang/String;)V")
char param[] = "hello , I,m C++";
jstring param1 = env->NewStringUTF(param);
env->CallVoidMenthod(obj, callback2ID, param1);
//sum
jmethodID sumxy = env->GetMethodID(clazz, "sum", "(DD)D");
jdouble result = env->CallDoubleMethod(obj, sumxy, 20.0, 30.0);
printf("In C++ >> sum(20.0 30.0) = %f", result);
return;
}