Android NDK Java传参到C
Java 到 C/C++的参数传递这块,真的是做 NDK 开发绕不开的环节。你用 NDK 写点性能要求高的代码还挺常见的,比如音视频、算法计算啥的。这时候就得靠JNI出场,把 Java 的数据准确地丢给 C 层用。
Java 里的 native 方法声明还是挺,用native
关键字搞定就行,像下面这样:
public native void callNative(int paramInt, String paramString);
通过System.loadLibrary("ndkdata")
把对应的 so 库拉进来。你要是用 AS 开发,生成头文件也不麻烦,直接点右键就能自动生成。
C/C++这边实现也没那么吓人。Java 传过来的String
在 C 里其实是jstring
类型,得用GetStringUTFChars
转成const char*
才能用,别忘了后面要ReleaseStringUTFChars
释放资源,不然容易出坑。
const char *str = env->GetStringUTFChars(paramString, NULL);
// ... 使用 str 做你该做的事
env->ReleaseStringUTFChars(paramString, str);
编译 native 库建议用 Gradle 的externalNativeBuild
配置,集成体验还不错。你也可以手动搞ndk-build
,自由度高,但配置稍复杂点。
调用也直接,就像平常写 Java 代码一样:
NdkBridge bridge = new NdkBridge();
bridge.callNative(123, "Hello, NDK!");
记得提前编译好.so 文件,不然UnsatisfiedLinkError
分分钟报给你看。
如果你正打算把 Java 的数据交给 C 层做,那这个流程你得滚瓜烂熟才行。数据类型、JNI 函数签名这些,出错了调试挺折腾的。哦对了,传复杂数据结构的可以研究下NewObjectArray
之类的 JNI 方法。
1.41MB
文件大小:
评论区