Linux下安卓ndk混合编译调用so方法——QuickStart学习
转自:http://www.52pojie.cn/thread-313869-1-1.html
#注意:.h 和.c中的错误eclipse不会检查,只会调用时在手机或虚拟机中死掉。因此需要仔细检查其中的语法和命名。
#Java_com_example_testforso_JniGg_ggPrintHello:Java_包名_类名_函数名
#(JNIEnv * env, jclass this)前两个参数固定。
system.loadlibrary("so名称"),与android.mk中的LOCAL_MODULE := & LOCAL_SRC_FILE := 的值对应
x1:新建立一个安卓工程
0x2:编写调用so代码和方法定义
在MainActivity.java同目录下创建一个JniGg.java文件,用于调用so
<ignore_js_op>
0x3:生成文件头.h文件
在这个目录可以看到我们编写好并且已经编译的class文件,eclipse是自动编译的。
<ignore_js_op>
一切正常编译,那么现在我们回到工程根目录下:
<ignore_js_op>
然后在命令行切换到此目录:
<ignore_js_op>
现在我们使用下面的命令:javah -classpath bin/classes -d jni com.ggndktest1.JniGg
<ignore_js_op>
不报错,并且成功编译出.h文件,才算成功的。
上面需要注意的是那个bin/classes,因为我的电脑上编译完的classes目录是这个样子的,参照上文那个文件目录的截图图片,个别电脑上不需要/classes。然后在Eclipse,右击工程,进行刷新,可以看到如下截图:
0x4:编写c代码
在jni目录下新建file,gg-jni.c自己看看代码,也就知道啥意思了
然后就是Android.mk文件的编写了
0x5:生成so文件
切换到工程根目录,然后直接ndk-build即可。这里需要注意,ndk-build需要配置环境变量,自行搜索配置方法即可。
0x6:android调用代码
新建一个TextView,然后显示so里面的字符串。然后运行我们的测试代码:
最后代码
在这个目录可以看到我们编写好并且已经编译的class文件,eclipse是自动编译的。
<ignore_js_op>

一切正常编译,那么现在我们回到工程根目录下:
<ignore_js_op>

然后在命令行切换到此目录:
<ignore_js_op>

现在我们使用下面的命令:javah -classpath bin/classes -d jni com.ggndktest1.JniGg
<ignore_js_op>

不报错,并且成功编译出.h文件,才算成功的。
上面需要注意的是那个bin/classes,因为我的电脑上编译完的classes目录是这个样子的,参照上文那个文件目录的截图图片,个别电脑上不需要/classes。然后在Eclipse,右击工程,进行刷新,可以看到如下截图:

0x4:编写c代码

在jni目录下新建file,gg-jni.c自己看看代码,也就知道啥意思了

然后就是Android.mk文件的编写了

0x5:生成so文件

切换到工程根目录,然后直接ndk-build即可。这里需要注意,ndk-build需要配置环境变量,自行搜索配置方法即可。
0x6:android调用代码

新建一个TextView,然后显示so里面的字符串。然后运行我们的测试代码:

最后代码
1 /* DO NOT EDIT THIS FILE - it is machine generated */ 2 #include <jni.h> 3 /* Header for class com_example_testforso_JniGg */ 4 5 #ifndef _Included_com_example_testforso_JniGg 6 #define _Included_com_example_testforso_JniGg 7 #ifdef __cplusplus 8 extern "C" { 9 #endif 10 /* 11 * Class: com_example_testforso_JniGg 12 * Method: ggPrintHello 13 * Signature: ()Ljava/lang/String; 14 */ 15 JNIEXPORT jstring JNICALL Java_com_example_testforso_JniGg_ggPrintHello 16 (JNIEnv *, jclass); 17 18 JNIEXPORT jint JNICALL Java_com_example_testforso_JniGg_getCoin 19 (JNIEnv *, jobject); 20 21 #ifdef __cplusplus 22 } 23 #endif 24 #endif
1 #include "com_example_testforso_JniGg.h" 2 3 JNIEXPORT jstring JNICALL Java_com_example_testforso_JniGg_ggPrintHello 4 (JNIEnv * env, jclass this) 5 { 6 return (*env)->NewStringUTF(env, "Hello!!!"); 7 } 8 9 JNIEXPORT jint JNICALL Java_com_example_testforso_JniGg_getCoin 10 (JNIEnv * env, jobject this) 11 { 12 int c=100; 13 14 return c; 15 }
1 package com.example.testforso; 2 3 public class JniGg { 4 static { 5 System.loadLibrary("gg-jni"); 6 } 7 8 static public native String ggPrintHello(); 9 static public native int getCoin(); 10 }
1 TextView tview; 2 @Override 3 protected void onCreate(Bundle savedInstanceState) { 4 super.onCreate(savedInstanceState); 5 setContentView(R.layout.activity_main); 6 7 tview=(TextView) this.findViewById(R.id.coin); 8 9 tview.setText(JniGg.ggPrintHello()+JniGg.getCoin()); 10 }
相关附件和文档:
http://pan.baidu.com/s/1pJ2Y047
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了