JNI学习记录1-初建JNI工程

JNI学习记录1-初建JNI工程
JNI学习记录2-local refence崩溃问题
JNI学习记录3-String and Array
JNI学习记录4-Fields
JNI学习记录5-Methods

在开发过程中遇到一些JNI问题,系统学习下.

一、java调用c++##

失败经历####

下面这篇教程较好,所以先按照他所述,一步一步进行。

http://www.open-open.com/lib/view/open1359700820369.html

环境:eclipse+vs2013+ndk

概括步骤为下:
****编写好java文件 ->javac test.java ->javah -jni 类 ->得到jni头文件 ->编写c/c++文件实现****
****1 、编写好java文件 ****
****JNI_javaCallc_test.java****

package test;
public class JNI_javaCallc_test {
public native int intMethod(int n);
public native boolean booleanMethod(boolean bool);
public native String stringMethod(String text);
public native int intArrayMethod(int[] intArray);
//java main方法
public static void main(String[] args){
//包含c语言动态库
System.loadLibrary("test_JNI_javaCallc_test"); //test_
JNI_javaCallc_test sample = new JNI_javaCallc_test();
int square = sample.intMethod(5);
boolean bool = sample.booleanMethod(true);
String text =sample.stringMethod("JAVA");
int sum = sample.intArrayMethod(new int[] { 1, 1, 2, 3, 5, 8, 13 });
System.out.println("intMethod: " + square);
System.out.println("booleanMethod: " + bool);
System.out.println("stringMethod: " + text);
System.out.println("intArrayMethod: " + sum);
}
} `

****2、生成JNI_javaCallc_test2进制文件****
javac JNI_javaCallc_test.java

****3、生成test_JNI_javaCallc_test.h****
javah -classpath . test.JNI_javaCallc_test

****4、编写test_JNI_javaCallc_test.c****

include <jni.h>
/* Header for class test_JNI_javaCallc_test */
JNIEXPORT jint JNICALL Java_test_JNI_1javaCallc_1test_intMethod(JNIEnv *env, jobject obj, jint num)
{
return num * num;
}
JNIEXPORT jboolean JNICALL Java_test_JNI_1javaCallc_1test_booleanMethod
(JNIEnv *env, jobject obj, jboolean boolean) {
return!boolean;
}
JNIEXPORT jstring JNICALL Java_test_JNI_1javaCallc_1test_stringMethod
(JNIEnv\ env, jobject obj, jstring string)
{
const char *str = (
env)->GetStringUTFChars(env, string, 0);
char cap[128];
strcpy(cap, str);
(env)->ReleaseStringUTFChars(env, string, str);
return (
env)->NewStringUTF(env, strupr(cap));
}
JNIEXPORT jint JNICALL Java_test_JNI_1javaCallc_1test_intArrayMethod
(JNIEnv *env, jobject obj, jintArray array)
{
int i, sum = 0;
jsize len = (*env)->GetArrayLength(env, array);
jint*body = (*env)->GetIntArrayElements(env, array, 0);
for(i=0; i<len; i++)
{ sum += body[i];
}
(*env)->ReleaseIntArrayElements(env, array, body, 0);
return sum;
}

****5、生成test_JNI_javaCallc_test.dll****
cl -I"D:\Java\jdk1.8.0_112\include" -I"D:\Java\jdk1.8.0_112\include\win32" -I"D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include" -LD test_JNI_javaCallc_test.c -Fe test_JNI_javaCallc_test
****6、运行****
java -cp . test.JNI_javaCallc_test (这里为class文件)

****然而,最后一步总会出错,可能是NDK和VS不匹配的原因吧,具体不详。总之,这个方法没有成功,但是学到了怎么从java类文件到jni的.h文件,再到.c/.cpp文件。****

成功经历1##

环境:android stdio 2.2.2

Z(Y)MDZOFDY9PC_Z21J}$9G.png

选上这一项直接支持c++,这种方法使用的是cmake。

成功经历2##

下面使用ndk_build,还是使用android stdio 2.2.2
以此博文为例:

http://blog.csdn.net/yanbober/article/details/45309049/

1、创建工程时,不勾选支持c++,按照上文所述方法,一直进行下来,在build时会报错。
2、此时需要在jni文件夹下添加,Android.mk文件。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := YanboberJniLibName
LOCAL_LDFLAGS := -Wl,--build-id
LOCAL_LDLIBS :=
-llog
-lz
-lm
LOCAL_SRC_FILES :=
C:\Users\zhanganl\Desktop\Jni_test\jni_test_stdio\jni_test_stdio\app\src\main\jni\jnitest.cpp
LOCAL_C_INCLUDES += C:\Users\zhanganl\Desktop\Jni_test\jni_test_stdio\jni_test_stdio\app\src\main\jni
LOCAL_C_INCLUDES += C:\Users\zhanganl\Desktop\Jni_test\jni_test_stdio\jni_test_stdio\app\src\debug\jni
include $(BUILD_SHARED_LIBRARY)

3、在app的build.gradle的android括号最后添加
>externalNativeBuild {
ndkBuild{
path "src/main/jni/Android.mk"
}
指向Android.mk。图形如下:

jni_build_gradle.png

***此步骤可以完成java调用c/c++的功能 ***

完整工程

https://github.com/zhanganl/jni_test/tree/master

疑惑:

https://github.com/wobiancao/NdkJniDemo
这个demo没有编写Android.mk,不知道为什么可以自动生成Android.mk。

推荐文档:
http://docs.anysdk.com/others/information/jni-tutorial/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容

  • _ 声明: 对原文格式以及内容做了细微的修改和美化, 主要为了方便阅读和理解 _ 一. 基础 Java Nativ...
    元亨利贞o阅读 5,865评论 0 34
  • 花了几天时间研究了下JNI,基本上知道如何使用了。照我的观点JNI还是不难的,难得只是我们一份尝试的心。 学习过程...
    皇小弟阅读 1,582评论 0 1
  • 原网页:http://www.blogjava.net/china-qd/archive/2006/04/29/4...
    初见破晓阅读 3,937评论 0 0
  • JNI 学习笔记 1.概述 Java Native Interface(JNI) 是JDK提供的一个native编...
    JellyJoe_943阅读 4,152评论 1 13
  • 闺蜜宋大小姐微扬着头,对我说:“你是一个让人爱、让人恨,却绝不会让人厌的人”。 一直觉得,自己是一个不擅交际的人,...
    雨巷子阅读 1,144评论 0 10