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 方法。

rar 文件大小:1.41MB